インデックスが無効化され、indexer_reindex_all_invalid が継続的に実行されます

この記事では、継続的なインデックス再作成に起因するパフォーマンスの問題がサイトで発生した場合に、問題に対して考えられる回避策を提供します。 これは、cron ジョブが継続的に実行され、再インデックス時 indexer_reindex_all_invalid キャッシュがクリーンアップされることが原因で発生します。

説明 description

環境

Adobe Commerce(クラウドおよびオンプレミス) 2.4.0 以降( カテゴリ権限 は、AdobeのCommerceのみの機能なので、Magento Open Sourceには影響しません)。

問題

New Relic Oneでは、エラーログに、1 秒 > 間(例えば、何かを処理中など)で何度も実行されている indexer_update_all_views が表示されます。

原因

コア Adobe Commerce インポーターを(手動または cron で)実行すると、複数のコアモジュールをまたいだ一連のプラグインが実行され、無効化するインデックスが決定されます。

この問題は、Commerce管理者で カテゴリ権限 モジュールが有効になっている場合に発生します。 これが true の場合、モジュールのプラグインは、インポートの実行時に常に製品およびカテゴリインデックス(およびリンクインデックス)を無効にします。 標準の読み込みタイプを調べると、すべてが カテゴリ権限 に影響します。 無効化が必要です。

さらに、サイトで B2B モジュールが有効になっている場合、 共有カタログ がアクティブになると、 カテゴリ権限 がオンになりロックされます。 共有カタログ をオフにすると カテゴリ権限 のロックが解除されますが、オフに切り替わることはありません。

MySQL データベースの cron ログを確認する:

MySQL データベースにログインすると、cron ログで すべてのインデックスを再インデックス化 プロセスを確認できます。
これは 必ず 何度も表示されますが、重要な要因は、プロセスが 2 つの可能なことの 1 つを実行することです。

プロセスが実行できるのは、次の 2 つのうちいずれかのみです。

  1. なし:0~1 秒(1 秒以下)かかります。プロセスは、何か実行する必要があるかどうかを確認し、何も実行する必要がない場合は停止します。
  2. すべてを再インデックス化します。通常は数分かかります。

通常、このプロセスの発生件数を多数確認したいのですが、実行時間は 1 秒未満です。
したがって、マーチャントはこの MySQL クエリを使用して、実行に 1 秒以上 かかるトランザクションを検索できます。

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

期間の記録期間は、次のコマンドを実行することで確認できます。

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;

これが適切な評価を行うのに十分な時間を与えない場合は、この Cron (スケジュールされたタスク)ガイドに従って成功した cron プロセスがログに保持される時間を増やし ​ 成功履歴の有効期間 値を増やすことができます(デフォルトは 60 分のみです)。

解決策 resolution

afterImportSource メソッドがカスタムインポーターを除外するように、Magento\CatalogPermissions\Model\Indexer\Plugin\Import を拡張します。

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;
    }

ここで、ENTITY_CODE は、カスタムインポーターの import.xml ファイルのエンティティ名パラメーターに使用される値です。

関連資料

Adobe Commerce Operations Configuration Guide の Cron ジョブの設定 ​ を参照してください。

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