Redis 在芹菜中,如何确保在工人崩溃时重试任务 首先请不要把这个问题看成是的重复。
我设置了一个使用Redis 在芹菜中,如何确保在工人崩溃时重试任务 首先请不要把这个问题看成是的重复。,redis,scheduled-tasks,celery,django-celery,celery-task,Redis,Scheduled Tasks,Celery,Django Celery,Celery Task,我设置了一个使用芹菜和redis作为broker和result\u后端的环境。我的问题是如何确保当芹菜工人崩溃时,当芹菜工人恢复时,所有计划的任务都会重新尝试 我已经看到了一些建议,建议使用芹菜\u ACKS\u LATE=True,这样代理将重新驱动任务,直到它得到一个ACK,但在我的情况下,它不起作用。每当我安排一项任务时,它都会立即转到工作进程,工作进程会将任务持续到计划的执行时间。让我举一些例子: 我正在安排这样的任务:res=test\u task.apply\u async(coun
芹菜和redis
作为broker
和result\u后端
的环境。我的问题是如何确保当芹菜工人崩溃时,当芹菜工人恢复时,所有计划的任务都会重新尝试
我已经看到了一些建议,建议使用芹菜\u ACKS\u LATE=True
,这样代理将重新驱动任务,直到它得到一个ACK,但在我的情况下,它不起作用。每当我安排一项任务时,它都会立即转到工作进程,工作进程会将任务持续到计划的执行时间。让我举一些例子:
我正在安排这样的任务:res=test\u task.apply\u async(countdown=600)
,但在芹菜工人日志中,我立即可以看到类似这样的内容:Got task from broker:test\u 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
显然这就是芹菜的行为。
当工作进程被突然终止(但调度进程未终止)时,即使您的acks_late=True,消息仍将被视为“失败”
动机(据我所知)是,如果消费者因为内存不足而被操作系统杀死,那么重新交付相同的任务就没有意义了
你可以在这里看到确切的问题:
我实际上不同意这种行为。在我看来,不承认会更有意义。您使用的是哪种芹菜版本?看一看这个帖子,它可能会帮助你感谢链接。芹菜版是v3.0.12(交叉幻灯片),现在我意识到任务并没有完全丢失。它确实是在埃塔时间送到芹菜的。因此,我猜行为是这样的:当一个任务被调度时,它会立即被交付给工作者,而代理会等待确认。如果工作进程未在ETA内确认,则它将尝试重新发送,从而确保任务得到执行。@aqs但如果。当计划任务时,它将立即交付给工作进程。
为真,这意味着选择工作进程
执行要在实际执行开始之前完成。对于调度器(分布式系统)来说,这似乎不太合适,它应该在跨工作者调度任务之前动态地考虑负载因素