在芹菜中,如何确保在工人崩溃时重试任务

时间:2013-01-18 17:40:50

标签: redis scheduled-tasks celery django-celery celery-task

首先,请不要将此问题视为this question

的副本

我设置的环境使用celeryredis作为brokerresult_backend。我的问题是如何确保当芹菜工人崩溃时,所有计划的任务都会重新尝试,当芹菜工人回来时。

我已经看到了关于使用CELERY_ACKS_LATE = True的建议,以便代理会重新驱动任务直到获得ACK,但在我的情况下它不起作用。每当我安排一项任务时,它会立即发送到工作人员,该工作人员将其持续到预定的执行时间。让我举个例子:

我正在安排这样的任务:res=test_task.apply_async(countdown=600),但是在芹菜工人日志中,我可以看到类似的内容:Got task from broker: test_task[a137c44e-b08e-4569-8677-f84070873fc0] eta:[2013-01-...]。现在,当我杀死芹菜工人时,这些预定的任务就会丢失。我的设置:

BROKER_URL = "redis://localhost:6379/0"  
CELERY_ALWAYS_EAGER = False  
CELERY_RESULT_BACKEND = "redis://localhost:6379/0"  
CELERY_ACKS_LATE = True

1 个答案:

答案 0 :(得分:2)

显然这是芹菜的表现。 当工作人员被突然杀死(但没有调度过程)时,即使您有acks_late = True

,该消息也将被视为“失败”

动机(据我了解)是,如果消费者由于内存不足而被操作系统杀死,那么重新交付相同任务毫无意义。

您可能会在这里看到确切的问题:https://github.com/celery/celery/issues/1628

我实际上不同意这种行为。 IMO,不承认就更有意义。