【问题标题】:Avoiding duplicate jobs in delayed_job queue避免延迟作业队列中的重复作业
【发布时间】:2021-03-24 13:11:33
【问题描述】:

我在避免重复作业被添加到我的应用程序延迟作业队列时遇到问题。我做了一些搜索,但都没有结果。任何有关如何实施解决方案的建议将不胜感激。

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

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

【问题讨论】:

  • 您能否添加一个重复作业的示例,这些作业在排队时会导致问题。这可能有助于为您的特定问题提出解决方案。
  • 这里不错的解决方案:stackoverflow.com/a/70041500/1536309

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


【解决方案1】:

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

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

【讨论】:

  • 感谢您的回复。这是我认为我最终会走的方向。我很想知道是否有任何选项或简单的解决方案我掩饰以禁止重复。再次感谢。
【解决方案2】:

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

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

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

以下是如何通过延迟作业插件完成此任务的要点:https://gist.github.com/synth/fba7baeffd083a931184

【讨论】:

    猜你喜欢
    • 2017-12-02
    • 1970-01-01
    • 1970-01-01
    • 2019-08-13
    • 1970-01-01
    • 2011-08-26
    • 2018-08-16
    • 2013-09-04
    • 2022-10-08
    相关资源
    最近更新 更多