Índices invalidados e indexer_reindex_all_invalid executados constantemente

Este artigo fornece uma possível solução alternativa para o problema em que o site tem problemas de desempenho causados por reindexação constante. Isso é causado pelo trabalho cron indexer_reindex_all_invalid em execução contínua e pelos caches limpos em reindex.

Produtos e versões afetados

  • Adobe Commerce (nuvem e no local) 2.4.0+ (Como Category Permissions é um recurso exclusivo do Adobe-Commerce, ele não afetará o Magento Open Source.)

Problema

No New Relic One os logs de erro devem mostrar indexer_update_all_views em execução várias vezes com um tempo > 1 segundo (isto é, ele está processando algo).

Causa

Quando o importador principal do Adobe Commerce é executado (manualmente ou por cron), um conjunto de plug-ins em vários módulos principais é executado para determinar quais índices devem ser invalidados.

O problema ocorre quando o módulo Category Permissions está habilitado no Commerce Admin. Se isso for verdadeiro, o plug-in do módulo sempre invalida os índices Produto e Categoria (e índices vinculados) quando uma importação é executada. Se os tipos de importação padrão forem examinados, todos eles afetarão Category Permissions. Invalidação esperada.

Além disso, quando um site tiver módulos B2B habilitados, se Shared Catalog estiver ativado, ele será ativado e bloqueará Category Permissions. Desativar Shared Catalog desbloqueará Category Permissions, mas não o desativará.

Verificando cron logs no banco de dados MySQL:

Se você fizer logon no banco de dados MySQL, eles poderão verificar o log cron para o processo reindex all indexes.
Este deveria aparecer várias vezes, mas o fator importante é que o processo faz uma de duas coisas possíveis.

O processo só pode executar uma destas duas ações:

  1. Nada: levaria de 0 a 1 segundo (um segundo ou menos) - o processo verifica se precisa fazer algo e pára se não precisa fazer nada.
  2. Reindex tudo: Sempre levará tempo - normalmente alguns minutos.

Normalmente, você gostaria de ver muitas ocorrências do processo, mas com um tempo de execução de menos de um segundo.
Um comerciante pode, portanto, usar esta consulta MySQL para localizar transações que levam mais de 1 segundo para serem executadas:

SELECT TIMESTAMPDIFF(SECOND, executed_at, finished_at) AS period FROM cron_schedule WHERE job_code = 'indexer_reindex_all_invalid' HAVING period > 1

Você pode ver por quanto tempo um período é registrado executando:

SELECT executed_at FROM cron_schedule WHERE job_code = 'indexer_reindex_all_invalid' AND executed_at IS NOT NULL ORDER BY executed_at ASC LIMIT 1;

Se isso não lhe der um período suficientemente longo para fazer uma avaliação adequada, você pode aumentar o tempo que um processo cron bem-sucedido será mantido no log seguindo este guia Cron (tarefas agendadas) e aumentando o valor Success History Lifetime (o padrão é apenas 60 minutos).

Solução

Estenda Magento\CatalogPermissions\Model\Indexer\Plugin\Import para que o método afterImportSource exclua o importador personalizado.

    public function afterImportSource(\Magento\ImportExport\Model\Import $subject, $import)
    {
        if ($this->config->isEnabled() && $subject->getEntity() !== 'ENTITY_CODE') {
            $this->indexerRegistry->get(\Magento\CatalogPermissions\Model\Indexer\Category::INDEXER_ID)->invalidate();
            $this->indexerRegistry->get(\Magento\CatalogPermissions\Model\Indexer\Product::INDEXER_ID)->invalidate();
        }
        return $import;
    }

Onde ENTITY_CODE é o valor usado para o parâmetro de nome de entidade no arquivo import.xml para o importador personalizado.

Leitura relacionada

Configurar cron trabalhos no Guia de Configuração de Operações do Adobe Commerce.

recommendation-more-help
8bd06ef0-b3d5-4137-b74e-d7b00485808a