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

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

影響を受ける製品とバージョン

  • Adobe Commerce(クラウドおよびオンプレミス) 2.4.0 以降(Category Permissions はAdobeCommerceのみの機能なので、Magento Open Sourceには影響しません)。

問題

New Relic One のエラーログには、1 秒を超える時間で何度も実行されている(つまり、何かを処理している) indexer_update_all_views が表示されます。

原因:

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

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

さらに、サイトで B2B モジュールが有効になっている場合、Shared Catalog がアクティブになると、Category Permissions のモジュールがオンになりロックされます。 Shared Catalog をオフにするとロックは解除 Category Permissions れますが、オフに切り替えることはできません。

MySQL データベース内 cron ログを確認しています :

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

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

  1. なし:0~1 秒(1 秒以下)かかります。プロセスは、何か実行する必要があるかどうかを確認し、何も実行する必要がない場合は停止します。
  2. すべてを Reindex る:それは常に時間がかかります – 通常分。

通常、このプロセスの発生件数を多数確認したいのですが、実行時間は 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 プロセスがログに保持される時間を増やしSuccess History Lifetime 値を増やすことができます(デフォルトは 60 分だけです)。

解決策

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 の Configure cron jobs

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