在我的 Laravel 项目中,我有 5 到 6 个不同的队列。每个队列都会按照严格的顺序触发下一个队列,形成如下的处理链:
工作 1 → 工作 2 → 工作 3 → 工作 4 → 工作 5
该流程始终由以 Job1 开头的外部请求触发。每个作业执行一个文件操作(创建/修改文件),这些文件存储在执行该作业的服务器本地。
当我尝试通过添加更多服务器来处理队列来实现水平扩展时,问题就出现了。由于 Laravel 队列是分布式的,因此无法保证 Job2 会由处理 Job1 的同一台服务器处理——这会中断流程,因为 Job2 需要访问 Job1 创建的本地文件。
我的需求:我想确保一旦 Job1 在特定服务器上启动,整个作业链(Job2 到 Job5)就会在同一服务器上继续运行 — — 即使在多服务器设置中也是如此。
我尝试过的方法:将“机器 ID”附加到作业有效负载 - 但这并不能保证该作业将被同一台机器接收。
在线搜索“粘性作业”或“将作业固定到同一个工作者/服务器” - 但找不到干净或官方的解决方案。
我的问题是:有人处理过类似的需求吗?在 Laravel 中,运行分布式队列系统时,有没有一种行之有效的方法可以将作业链固定到同一台服务器上?