在 Laravel 6 中,在队列执行过程中,一些视图文件未执行的排查分析

1、参考:在 Laravel 6 中,在队列执行过程中,每一个任务的执行,皆会执行 View::addLocation($location);,然而每一个任务皆只会取第 1 个任务的 $location 。但是发现后续在生产环境中仍然存在问题。在队列执行过程中,一些视图文件未执行(”setting_migrations”:[])。如图1

图1

INSERT INTO "" ("source_db", "store_name", "id", "theme_installation_id", "theme_installation_version_preset_id", "from_version", "to_version", "processing", "processing_failed", "step", "failed_message", "extra", "created_at", "updated_at") VALUES ('aws_db12', 'buglcexk30', 5, 5, 5, 'v2.11.1', 'v3.4.0', 0, 0, 7, '', '{"setting_migrations":[],"theme_download_paths":{"zip_path":"/theme_downloads/2023/11/07/1699423025.8743.1229090882.zip","destination":"/theme_downloads/2023/11/07/1699423025.8743.1229090882"}}', '2023-11-08 05:57:02', '2023-11-08 05:57:13');
INSERT INTO "" ("source_db", "store_name", "id", "theme_installation_id", "theme_installation_version_preset_id", "from_version", "to_version", "processing", "processing_failed", "step", "failed_message", "extra", "created_at", "updated_at") VALUES ('aws_db18', 'carver10', 7, 7, 7, 'v2.11.1', 'v3.4.0', 0, 0, 7, '', '{"setting_migrations":[{"file":"v3.0.0/migrate_product_detail.php","exec_at":"2023-11-08 05:57:11"},{"file":"2023_07_11_10_custom_mobile_layout/migrate_product_detail.php","exec_at":"2023-11-08 05:57:11"}],"theme_download_paths":{"zip_path":"/theme_downloads/2023/11/07/1699423022.7951.958836417.zip","destination":"/theme_downloads/2023/11/07/1699423022.7951.958836417"}}', '2023-11-08 05:57:01', '2023-11-08 05:57:11');
INSERT INTO "" ("source_db", "store_name", "id", "theme_installation_id", "theme_installation_version_preset_id", "from_version", "to_version", "processing", "processing_failed", "step", "failed_message", "extra", "created_at", "updated_at") VALUES ('aws_db3', 'cisfioadre59', 8, 8, 8, 'v2.11.1', 'v3.4.0', 0, 0, 7, '', '{"setting_migrations":[],"theme_download_paths":{"zip_path":"/theme_downloads/2023/11/07/1699423022.7315.1637916782.zip","destination":"/theme_downloads/2023/11/07/1699423022.7315.1637916782"}}', '2023-11-08 05:57:01', '2023-11-08 05:57:11');

2、由于在测试环境一直未复现,最后决定尽量模拟生产环境的部署方式。从单机部署为集群,在 Raccher 的工作负载中,点击 Pod 可用副本数 右侧的 +,添加一个 Pod。尝试复现此缺陷。如图2

图2

3、最后发现原因在于队列服务器为集群模式,在集群模式下,队列任务之间存在一定的依赖关系被破坏。我举例说明一下,在 A 机器上执行了队列 InstallThemeToDb ,那么在这台机器上存在解压缩后的主题包文件。但是在队列 InstallThemeToDb执行完成后,会触发下一个队列 MigrateThemeSettings 的执行,但是这个队列可能在 B 机器 上执行了。此时,这个队列的执行依赖于之前解压缩后的主题包文件,可是 ,B 机器上不存在。进而导致主题迁移文件未执行到。

4、现在存在3种解决方案:
(1)将 2 个 Job 合并为 1 个;
(2)想办法强制让两个 job 在同一台机器上执行;
(3)不同的机器共享一个存储,然后解压缩的主题包文件都放在共享存储上。这种方案要保证没有时间上的延迟才行了;

5、最终决定采用第 2 个方案:想办法强制让两个 job 在同一台机器上执行。如果您想立即(同步)执行队列任务,可以使用 dispatchNow 方法。使用此方法时,队列任务将不会排队,并立即在当前进程中运行。

MigrateThemeSettings::dispatchNow($this->themeInstallationTask);

6、当在 队列 MigrateThemeSettings 中抛出异常时,并未执行 MigrateThemeSettings 中的 failed 方法,而是执行的 InstallThemeToDb 中的 failed 方法。符合预期。如图3

图3

7、当在 队列 MigrateThemeSettings 中查找 解压缩后的主题包文件 时,不再出现找不到的情况,符合预期。

永夜