【问题标题】:What happens to a Celery Worker's scheduled (eta) tasks when it shuts down?Celery Worker 的计划(eta)任务在关闭时会发生什么?
【发布时间】:2015-04-21 07:42:17
【问题描述】:

我一直在学习芹菜,但无法找到概念性问题的答案,并且在实验中得到了奇怪的结果。

当有计划任务(通过计划,我不是指定期,而是计划在将来使用 eta=x 运行)提交给 Celery 时,它们似乎立即被工作人员从队列中消耗(而不是留在 Redis 默认的 celery 键/队列中)。据推测,worker 将在 eta 处实际执行任务。

如果该工作人员被关闭或重新启动(例如更新它的注册任务)会发生什么?那些计划任务会丢失吗?它们没有“运行”,因此热终止当然不会等待它们完成。

有没有办法强制这些任务返回队列并由下一个可用的工作人员使用?

我想,手动地,可以在关闭工人之前转储任务:

http://celery.readthedocs.org/en/latest/userguide/workers.html#inspecting-workers

并在新工作人员备份时重新提交...但这应该自动发生吗?

非常感谢您对此的任何帮助

谢谢

【问题讨论】:

    标签: python celery


    【解决方案1】:

    看看acks_late http://celery.readthedocs.org/en/latest/reference/celery.app.task.html#celery.app.task.Task.acks_late

    如果设置为 true,Celery 会将任务保留在队列中,直到成功执行。

    【讨论】:

    • 澄清一下,这意味着如果一个任务被设置为在两小时内执行(例如 eta = 从现在开始的 2 小时),那么它将保留在队列中并且仅在执行点被消耗?
    • 一个工人将抓住任务,但直到 ETA 才执行它。如果工作人员死亡,任务将返回队列,因为它仅在完成时才确认。
    【解决方案2】:

    更新:Celery 5.1

    即使启用了acks_late,工作人员也会确认该消息。这是库规定的默认和有意设置。 [Ref]

    要更改默认设置并重新排列未完成的任务,您可以使用task_reject_on_worker_lost 配置。 [Ref]

    但请记住,如果您的任务不是幂等性,这可能会导致消息循环并导致意外影响。

    特别是对于 eta 任务,队列在删除它们之前等待工作人员确认任务。使用默认设置,celery 工作人员在任务执行之前立即确认,并在任务执行完成时使用acks_late

    因此,当工作人员可能由于关闭/重新启动/lost_connection 或 Redis/SQS visibility_timeout 超出 [ref] 的情况下无法确认任务时,队列会将消息重新传递给任何可用的工作人员。

    【讨论】:

      猜你喜欢
      • 2020-06-18
      • 2022-01-13
      • 1970-01-01
      • 2011-07-18
      • 1970-01-01
      • 2021-04-19
      • 2017-09-22
      • 2012-09-22
      • 2016-01-27
      相关资源
      最近更新 更多