aligent/magento2-indexer-fix

解决核心 Magento 定期索引以避免不一致的索引数据的问题

安装次数: 6,659

依赖项: 0

建议者: 0

安全: 0

星标: 7

关注者: 6

分支: 3

开放问题: 0

类型:magento2-module

1.0.1 2023-01-24 04:17 UTC

This package is auto-updated.

Last update: 2024-08-25 04:04:43 UTC


README

此模块旨在修复围绕 Magento 2 中定期 "mview" 索引的常见问题。

背景

当索引器设置为按计划更新时,情况如下

  • 每个索引器都有一个相应的更改日志数据库表。
  • 每个索引器订阅了多个数据库表 - 当订阅的表中发生更改时,将向索引器的更改日志表中添加一条记录。

此外,一些索引器使用另一个索引器创建的数据。例如,catalogsearch_fulltext 索引器可能使用索引的分类和价格数据。

通过 indexer_update_all_views cron 作业更新索引数据。该作业遍历所有计划中的索引器,并根据每个索引器的最新更改日志记录更新其数据。

问题

indexer_update_all_views 运行时,它将获取单个索引器的更改日志信息,处理它,然后继续下一个。

  1. 对于 catalog_product_pricecatalogsearch_fulltext 记录,mview_state 表的 version_id 都是 100
  2. 两个更改日志表 catalog_product_price_clcatalogsearch_fulltext_cl 也都在版本 100
  3. 更新了 10 个产品的价格
    1. 这向 catalog_product_price_clcatalogsearch_fulltext_cl 添加了 10 条记录
    2. 更改日志表中的最新版本现在是 110
  4. indexer_update_all_views 开始,并开始处理 catalog_product_price 索引器。
    1. 它确定需要处理更改日志记录 101-110
  5. 在价格索引器完成处理之前,又更新了 10 个产品的价格。
    1. catalog_product_price_clcatalogsearch_fulltext_cl 添加了 10 条记录
    2. 更改日志表中的最新版本现在是 120
  6. indexer_update_all_views 完成处理价格索引器,并继续处理 catalogsearch_fulltext
    1. 它确定需要处理更改日志记录 101-120
  7. indexer_update_all_views 完成
  8. 下次运行 indexer_update_all_views 时,为价格索引器处理记录 111-120

之后,一切都 看起来 都是最新的 - 这并不是真的。由于 catalogsearch_fulltext 索引器使用索引的价格数据,当它处理记录 101-120 时,它没有最新的 111-120 数据,因为这些尚未被价格索引器处理。

与这些最后 10 条更改日志记录对应的产品将不会被 catalogsearch_fulltext 索引器再次更新,直到

  • 索引被作废并执行完整重新索引。
  • 以某种方式再次更新产品。

修复

为了避免与索引处理同时发生的更新引起的时序问题,此模块执行以下操作

  • indexer_update_all_views 开始处理之前,对所有更改日志表进行快照,记录(当时)的最新版本号。
  • ChangelogInterface->getVersion 函数添加了围绕插件,以便返回快照版本
    • 如果不存在快照,则根据正常功能从数据库中查找

通过这种方式,在作业运行时创建的任何新更改日志记录都将被忽略,并将由下一次运行处理。

安装

要安装此模块,可以运行以下命令

composer require aligent/magento2-indexer-fix
bin/magento module:enable Aligent_IndexerFix
bin/magento setup:upgrade