【发布时间】:2022-01-12 13:25:44
【问题描述】:
我在 laravel 5.2 中有一个遗留应用程序,我们使用队列来处理作业。我们观察到队列有时会获得过多的作业,这会导致重复作业被分派,因为之前的作业未完成处理,并且分派此类作业的 cron 再次运行并最终一遍又一遍地分派它们。
一个简单的解决方案是使这些工作独一无二,如果它是 laravel 8,这将是一个非常简单的改变。但是,我们处于 laravel 5.2 领域,所以我必须自己实施独特的工作。或者是否有人可以提出更好的选择?
另外,如果您要自己实施独特的工作,您会怎么做? 我正在考虑的方法是:
将作业的唯一键添加到缓存或数据库表中(意味着获得了锁) 处理完作业后清除条目(释放锁定) 在调度作业之前,检查缓存中是否存在key(可以获取锁)
【问题讨论】:
-
这真的很模糊。例如,在我天真的头脑中,如果您的 cron 不会分派以前完成的作业,您是否不能将其修改为不分派以前分派的作业?我觉得可能会出现很多这样的问题,因为除了模糊的描述之外,这里没有关于你的过程的真正细节
-
在调度作业时使用
withoutoverlapping和onQueue选项。 -
您在上一部分中描述了一个很好的解决方案。锁(又名互斥锁)适用于此用例。只有一件事,我也会检查工作内部的锁。由于在调度和作业执行之间可能有一些时间,我认为它更可靠。
-
@SachinKumar laravel 5.2 没有
withoutoverlapping选项 -
所以他们可能会选择将工作放在队列中!
标签: php laravel laravel-5 caching locking