没有不值得去解决的问题,也没有不值得去学习的技术!

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

由于在测试环境一直未复现,最后决定尽量模拟生产环境的部署方式。从单机部署为集群,在 Raccher 的工作负载中,点击 Pod 可用副本数 右侧的 +,添加一个 Pod。尝试复现此缺陷
1、参考:在 Laravel 6 中,在队列执行过程中,每一个任务的执行,皆会执行 View::addLocation($location);,然而每一个任务皆只会取第 1 个任务的 $location 。但是发现后续在生产环境中仍然存在问题。在队列执行过程中,一些视图文件未执行(”setting_migrations”:[])。如图1
在队列执行过程中,一些视图文件未执行("setting_migrations":[])
图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
由于在测试环境一直未复现,最后决定尽量模拟生产环境的部署方式。从单机部署为集群,在 Raccher 的工作负载中,点击 Pod 可用副本数 右侧的 +,添加一个 Pod。尝试复现此缺陷
图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
当在 队列 MigrateThemeSettings 中抛出异常时,并未执行 MigrateThemeSettings 中的 failed 方法,而是执行的 InstallThemeToDb 中的 failed 方法。符合预期
图3
7、当在 队列 MigrateThemeSettings 中查找 解压缩后的主题包文件 时,不再出现找不到的情况,符合预期。

PHP / Laravel / Yii2 老项目维护与长期技术支持

如果你的 PHP / Laravel / Yii2 项目已经上线,但遇到原开发离职、Bug 长期无人修复、接口不稳定、性能下降、代码难以接手等问题,可以联系我做一次远程技术排查。

适合以下情况:
✅ 老旧 PHP 系统无人维护
✅ Laravel / Yii2 项目 Bug 修复
✅ 后台管理系统小功能迭代
✅ RESTful API 接口排查
✅ MySQL / Redis / Nginx 性能问题
✅ 长期远程兼职维护

可先从一次小问题开始:
✅ 线上报错排查
✅ 接口异常分析
✅ 慢查询与性能瓶颈定位
✅ 代码结构初步评估
✅ 部署环境与日志检查

如需咨询,请联系我,并注明:PHP 维护咨询

联系方式:
Telegram:@shuijingwan
微信:13980074657
邮箱:shuijingwanwq@gmail.com

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理