Pergunta

Esta pergunta está sem resposta para mim há algum tempo e gostaria de obter uma resposta definitiva de alguém sobre como ela funciona.

Cenário:

Executando o Magento 1.14.2.1, configurei todos os meus indexadores para serem executados dentro do cronograma e executo o cron do Magento que executa enterprise_refresh_index sempre que algo precisar ser indexado parcialmente (ou totalmente?).

Antes da atualização para esta versão, eu estava executando a 1.13.1 e não estava usando o cron.Eu tinha indexadores configurados para serem ativados salvar, e sempre que eu precisasse forçar a execução de qualquer um dos indexadores, eu faria isso via shell/indexer.php ou usando o seguinte exemplo de código:

// Example of indexers passed in:
$indexers = ['catalog_product_flat', 'catalog_category_flat'];

foreach ($indexers as $code) {
    $process = Mage::getSingleton('index/indexer')
                   ->getProcessByCode($code)
                   ->reindexEverything();
}

Anteriormente...

Isso funcionou bem anteriormente em termos de fazer com que os indexadores fossem executados imediatamente quando eu quisesse e fazer com que as várias alterações necessárias fossem propagadas de forma relativamente rápida para o front-end, etc.

Obviamente, encontramos problemas de deadlock/bloqueio de tabela e indexadores conflitantes entre si quando tivemos vários usuários administradores salvando produtos etc. ao mesmo tempo, daí nossa mudança para a nova "melhor prática" de usar o cron do Magento para lidar com tudo isso. agendar.

Minhas perguntas:

  1. Como você substitui o estilo antigo de forçar a reindexação plana de um produto (php shell/indexer.php --reindex catalog_product_flat) com o equivalente agora por meio do cron job agendado?Tudo o que consigo ver é que você pode correr enterprise_refresh_index cron job, mas isso lida com todos os indexadores certo - nenhuma capacidade de destacar certas partes?
  2. É relevante precisar fazer mais isso?Com isso quero dizer que, ao executar o comando anterior, o Magento ainda teria indexado apenas o que precisava dentro do domínio plano do produto do catálogo e, ao executar a tarefa agendada, ele faria a mesma coisa, mas combinaria todos os indexadores em um?Se for esse o caso, tudo bem - é bastante confuso de entender.

Fundo:

Eu fiz esta pergunta com suporte do Magento EE.Eles voltaram para dizer que ele cai fora do campo dos acordos de apoio, mas ainda recebeu uma resposta de um dos desenvolvedores do Magento e me respondeu dizendo que "as mudanças no banco de dados são detectadas com gatilhos e os registros de changelog criados". Entendo que a partir daqui, o indexador programado decide o que precisa ser feito com base nesses registros do Changelog.

Anteriormente, eu presumi que se eu precisasse reindexar as tabelas planas de produtos (todos os produtos, tudo), eu faria isso na linha de comando, como no exemplo anterior.Como faço para conseguir a mesma coisa agora, se ele reindexar apenas aqueles que sabe que devem ser feitos por meio de changelogs?Existe uma maneira de reindexar todos dos dados simples do produto sem capturar todos os outros indexadores com eles por meio enterprise_refresh_index?

Não acho que seja relevante, mas usamos o módulo AOE_Scheduler para fornecer uma visão melhor do que o cron está fazendo.


Eu sei que é longo.Por favor, deixe-me saber se posso resumir um pouco melhor.Não tive sorte em obter uma resposta definitiva, e alguns usuários administradores não estão convencidos de que o cron do Magento reindexa tudo de forma eficaz sempre.Quando esse tipo de declaração é feita, eu normalmente reindexaria todos os dados simples do produto da CLI, mas não posso mais fazer isso porque causa conflitos com o indexador programado e o inferno começa.

Foi útil?

Solução

public function refreshIndex(Mage_Cron_Model_Schedule $schedule)
{
    /** @var $helper Enterprise_Index_Helper_Data */
    $helper = Mage::helper('enterprise_index');

    /** @var $lock Enterprise_Index_Model_Lock */
    $lock   = Enterprise_Index_Model_Lock::getInstance();

    if ($lock->setLock(self::REINDEX_FULL_LOCK)) {

        /**
         * Workaround for fatals and memory crashes: Invalidating indexers that are in progress
         * Successful lock setting is considered that no other full reindex processes are running
         */
        $this->_invalidateInProgressIndexers();

        $client = Mage::getModel('enterprise_mview/client');
        try {

            //full re-index
            $inactiveIndexes = $this->_getInactiveIndexersByPriority();
            $rebuiltIndexes = array();
            foreach ($inactiveIndexes as $inactiveIndexer) {
                $tableName  = (string)$inactiveIndexer->index_table;
                $actionName = (string)$inactiveIndexer->action_model->all;
                $client->init($tableName);
                if ($actionName) {
                    $client->execute($actionName);
                    $rebuiltIndexes[] = $tableName;
                }
            }

            //re-index by changelog
            $indexers = $helper->getIndexers(true);
            foreach ($indexers as $indexerName => $indexerData) {
                $indexTable = (string)$indexerData->index_table;
                $actionName = (string)$indexerData->action_model->changelog;
                $client->init($indexTable);
                if (isset($actionName) && !in_array($indexTable, $rebuiltIndexes)) {
                    $client->execute($actionName);
                }
            }

        } catch (Exception $e) {
            $lock->releaseLock(self::REINDEX_FULL_LOCK);
            throw $e;
        }

        $lock->releaseLock(self::REINDEX_FULL_LOCK);
    }

    return $this;
}

Isso é executado "sempre" em cada execução do cron.Ele executa reindexações completas para os índices necessários e processa o changelog para aqueles que não são necessários.

Além disso, você ainda pode executar os scripts de shell CLI, mas eles não considerarão o changelog parcial e farão cegamente uma reindexação completa.

Se você estiver recebendo bloqueios mortos, você pode querer definir todos os seus indexadores para Manual e configurar processos alternativos para reconstruir o índice fora dos horários de pico (quando os administradores estão ausentes).Apenas Preços dos produtos e Status do estoque deve ser definido como Atualizar ao salvar.

Lembre-se também de que com o status de reindexação parcial em index_process tabela não é mais usada, mas calculada a partir enterprise_mview_metadata.

Desativando alguns módulos internos como Mage_Rss também pode ajudar a impactar a frequência de invalidação dos índices.

Leitura adicional:

Outras dicas

Como um aparte, recentemente me deparei com o AOE_EeIndexerStats módulo do AOEpeople no GitHub - à primeira vista, parece que permitirá que você controle certas partes dos indexadores ou indexadores inteiros, todos abordados em enterprise_refresh_index.Isto seria potencialmente equivalente ao processo anterior, onde você poderia direcionar o catalog_product_flat índice por conta própria.

Também deve estar acessível em código como tal:

$client = Mage::getModel('enterprise_mview/client'); /* @var $client Enterprise_Mview_Model_Client */
$client->initByTableName($tablename);
$metadata = $client->getMetadata();
$metadata->setInvalidStatus();
$metadata->save();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a magento.stackexchange
scroll top