gpt4 book ai didi

redis - 在 celery 中,如何确保在工作人员崩溃时重试任务

转载 作者:IT王子 更新时间:2023-10-29 05:56:58 25 4
gpt4 key购买 nike

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

我设置了一个使用 celeryredis 作为 brokerresult_backend 的环境。我的问题是如何确保当 celery worker 崩溃时,所有计划的任务都会在 celery worker 恢复时重新尝试。

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

我正在安排这样的任务:res=test_task.apply_async(countdown=600),但是在 celery worker 日志中我可以立即看到类似这样的内容:从代理处获得任务:test_task [a137c44e-b08e-4569-8677-f84070873fc0] 时间:[2013-01-...] 。现在,当我杀死 celery worker 时,这些计划任务就丢失了。我的设置:

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

最佳答案

显然这就是 celery 的行为方式。当 worker 突然被杀死时(但调度过程没有),即使你有 acks_late=True ,消息也会被视为“失败”

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

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

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

关于redis - 在 celery 中,如何确保在工作人员崩溃时重试任务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14404531/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com