避免在delayed_job队列中重复的作业

时间:2014-10-21 20:28:41

标签: ruby-on-rails ruby delayed-job

我遇到了一个问题,即避免将重复的作业添加到我的应用程序中延迟的作业队列。我做了一些搜索,但都没有结果。任何有关如何实施解决方案的建议都将受到赞赏。

链接我偶然发现,但没有提供任何解决方案。

  1. https://github.com/collectiveidea/delayed_job/issues/72
  2. https://groups.google.com/forum/#!topic/delayed_job/gZ9bFCdZrsk

2 个答案:

答案 0 :(得分:4)

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

而不是预先检查重复项,作业本身应该足够聪明,以确定它是否仍然适合运行。例如,该作业可以首先检查模型上的状态,标志或时间戳。并且只有在前提条件仍然有效的情况下才开始实际处理。

答案 1 :(得分:2)

按照@spickermann的说法,任何重复检查都应该在后台进行,而不是在转储时。

我解决这个问题的方法是在delayed_jobs表上创建了2个新字段:signature和args。签名将是" Class#method"或"对象:id#method"。 Args将只是有效载荷对象的args。通过添加这些字段,您现在可以查询作业表以查看是否存在重复。

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

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