Í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 na reindexação.

Descrição description

Ambiente

Adobe Commerce (nuvem e no local) 2.4.0+ (Como Permissões de categoria é um recurso exclusivo do Adobe-Commerce, ele não afetará o Magento Open Source.)

Problema

Nos logs de erros do New Relic One, deve-se mostrar indexer_update_all_views em execução várias vezes com um tempo de > 1 segundo (por exemplo, ele está processando algo).

Causa

Quando o importador principal do Adobe Commerce é executado (manualmente ou pelo 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 Permissões de categoria está habilitado no Administrador do Commerce. 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 Permissões de categoria. Invalidação esperada.

Além disso, quando um site tem módulos B2B habilitados, se o Catálogo Compartilhado estiver ativado, ele é ativado e bloqueia as Permissões de Categoria. Desativar o Catálogo Compartilhado desbloqueará Permissões de Categoria, mas não o desativará.

Verificando logs cron no banco de dados MySQL:

Se você fizer logon no banco de dados MySQL, eles poderão verificar o log do cron para o processo reindexar todos os índices.
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. Reindexe tudo: sempre levará tempo - geralmente 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 do 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 longo o suficiente 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 de Tempo de Vida do Histórico de Sucesso (o padrão é de apenas 60 minutos).

Resolução resolution

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

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

recommendation-more-help
3d58f420-19b5-47a0-a122-5c9dab55ec7f