aligent / magento2-indexer-fix
解决核心 Magento 定期索引以避免不一致的索引数据的问题
1.0.1
2023-01-24 04:17 UTC
Requires
- php: ^8.1
- magento/framework: *
Requires (Dev)
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
运行时,它将获取单个索引器的更改日志信息,处理它,然后继续下一个。
- 对于
catalog_product_price
和catalogsearch_fulltext
记录,mview_state
表的version_id
都是100
。 - 两个更改日志表
catalog_product_price_cl
和catalogsearch_fulltext_cl
也都在版本100
。 - 更新了 10 个产品的价格
- 这向
catalog_product_price_cl
和catalogsearch_fulltext_cl
添加了 10 条记录 - 更改日志表中的最新版本现在是
110
- 这向
indexer_update_all_views
开始,并开始处理catalog_product_price
索引器。- 它确定需要处理更改日志记录
101-110
- 它确定需要处理更改日志记录
- 在价格索引器完成处理之前,又更新了 10 个产品的价格。
- 向
catalog_product_price_cl
和catalogsearch_fulltext_cl
添加了 10 条记录 - 更改日志表中的最新版本现在是
120
- 向
indexer_update_all_views
完成处理价格索引器,并继续处理catalogsearch_fulltext
。- 它确定需要处理更改日志记录
101-120
- 它确定需要处理更改日志记录
indexer_update_all_views
完成- 下次运行
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