12

首先,请不要将此问题视为此问题的 重复

我有一个使用celeryand redisasbrokerresult_backend. 我的问题是如何确保当芹菜工人崩溃时,当芹菜工人备份时,所有计划的任务都被重新尝试。

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

我正在安排这样的任务:res=test_task.apply_async(countdown=600),但立即在 celery worker 日志中我可以看到类似 :的内容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
4

1 回答 1

4

显然这就是芹菜的行为方式。当工人被突然杀死(但调度过程不是)时,即使您有 acks_late=True,该消息也会被视为“失败”

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

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

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

于 2018-11-15T18:44:55.957 回答