我一直在学习芹菜和避风港能够找到一个概念性问题的答案,并且尝试了奇怪的结果。
当有计划任务(按计划,我不是指周期性但计划将来使用eta = x运行)提交给Celery时,它们似乎是立即被工作人员从队列中消耗掉(而不是留在Redis默认的芹菜键/队列)。据推测,工人实际上将执行eta的任务。
如果该工作人员被关闭或重新启动(例如更新它的注册任务)会怎样?那些预定的任务会丢失吗?他们不是"跑步"所以热情的终止当然不会等到他们完成。
有没有办法强制这些任务返回队列并被下一个可用的工作者使用?
我想,手动,可以在关闭工作人员之前转储任务:
http://celery.readthedocs.org/en/latest/userguide/workers.html#inspecting-workers
并在新工作人员重新启动时重新提交...但是这应该是自动发生的吗?
非常感谢您对此的任何帮助
由于
答案 0 :(得分:2)
看看acks_late https://code.angularjs.org/1.4.1/docs/api/ng/type/ngModel.NgModelController
如果设置为true,Celery会将任务保留在队列中,直到成功执行为止。
答案 1 :(得分:0)
更新:Celery 5.1
即使启用了 acks_late
,工作人员也会确认该消息。这是图书馆规定的默认和有意设置。 [Ref]
要更改默认设置并使未完成的任务重新排队,您可以使用 task_reject_on_worker_lost
配置。 [Ref]
但请记住,如果您的任务不是幂等,这可能会导致消息循环并导致意想不到的效果。
特别是对于 eta 任务,队列在删除任务之前等待工作人员确认任务。在默认设置下,celery 工作人员在任务执行前立即确认,并在任务执行完成时使用 acks_late
。
因此,当工作人员无法确认任务时,可能是由于关闭/重启/lost_connection 或在 Redis/SQS visibility_timeout
超过 [ref] 的情况下,队列会将消息重新传递给任何可用的工作人员.