工作在进入第二项任务时进入繁忙的循环

我正在为一些后台服务运行delayed_job,直到最近,所有这些服务都是孤立运行的,例如发送电子邮件,编写报告等。

我现在需要一个delayed_job作为最后一步,提交另一个delayed_job。

  • delay.deploy() - 当delayed_job运行这个时,它触发一个部署操作,最后一步是...
  • delay.update_status() - 当delayed_job运行此作业时,它将检查我们开始部署的状态。 如果部署仍在进行中,我们再次调用delay.update_status(),如果部署已停止,我们将最终部署状态写入db记录。
  • 第1步工作正常 - 5秒后,delayed_job启动部署,启动部署,然后调用delay.update_status()。

    但是在这里,而不是update_status()在5秒内启动,delayed_job进入一个繁忙的循环,触发一堆update_status调用,并且在没有暂停的情况下很难循环。

    我可以看到日志满了所有这些调用,服务器变慢,直到达到update_status的最终条件(部署最终成功或失败),并且事情再次变得安静。

    我是否错误地使用了Delayed_Job :: delay(),我错过了这个用例的一个基本概念吗?


    好吧,事实证明这是“预期行为” - 如果您已经在运行delayed_job的代码中,并且再次调用.delay(),而没有指定延迟,它将立即运行。 您需要添加参数run_at:

      delay(queue: :deploy, run_at: 10.seconds.from_now).check_status
    

    查看Google小组中的讨论

    链接地址: http://www.djcxy.com/p/65781.html

    上一篇: job going into a busy loop when lodging second task

    下一篇: Delayed Processing Jobs in Ruby: How much is not blocking my path