Celery Worker 的预定 (eta) 任务关闭时会发生什么情况?

What happens to a Celery Worker's scheduled (eta) tasks when it shuts down?

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

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

如果要关闭或重新启动该工作程序(例如更新其已注册的任务),会发生什么情况?那些定时任务会丢失吗?它们不是 "running",因此热终止当然不会等待它们完成。

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

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

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

并在新员工恢复时重新提交...但这应该自动发生吗?

非常感谢对此的任何帮助

谢谢

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

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

更新:Celery 5.1

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

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

不过请记住,如果您的任务不是 idempotent

,这可能会导致消息循环并导致意想不到的效果

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

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