避免Delayed_Job队列中的重复作业

3

你能否提供一个重复作业的示例,这会在入队时引起问题。这可能有助于为您的特定问题提供解决方案建议。 - spickermann
这里有一个不错的解决方案:https://dev59.com/jKvka4cB1Zd3GeqPtndl#70041500 - Blair Anderson
2个回答

7

我不会专注于避免重复工作。在我看来,任务队列应该是无状态的,不保存状态。将工作添加到队列中应尽可能快。任何提前检查都会减缓响应时间。

相反,工作本身应该足够聪明,能够判断是否适合运行。例如,工作可以首先检查模型上的状态、标志或时间戳,只有当前提条件仍然有效时才开始实际处理。


谢谢您的回复。这正是我想要采取的方向。我很好奇是否有任何选项或简单的解决方案可以禁止重复。再次感谢。 - icantbecool

2

根据@spickermann所说,任何重复检查都应该在后台进行,而不是在转储时进行。

我解决这个问题的方法是在delayed_jobs表上创建了两个新字段:signature和args。Signature将是“Class#method”或“Object:id#method”。Args只是来自payload对象的args。通过添加这些字段,您现在可以查询作业表以查看是否有重复。

对于我们的应用程序,如果存在重复项,我们将取消当前作业,允许更近期的调用继续进行。但是,如果较新的重复作业不断添加到队列中,此方法可能会导致饥饿,因此您可能希望采用相反的方法,即如果存在重复项,则销毁除当前作业之外的所有未来调用。

以下是如何通过延迟作业插件实现此目标的要点:https://gist.github.com/synth/fba7baeffd083a931184


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接