首页 > 解决方案 > 继续重试 Celery 任务,仅在任务成功或达到最大重试次数时继续

问题描述

我有一个 Celery 任务,它通过指数退避重试失败。此任务将 Django 应用程序(称为“传输”)接收到的消息发布到第二个 Django 应用程序(称为“基础”)进行处理。这些消息必须按顺序处理,因此必须保持任务排队的顺序。然而,当一个任务失败时(因为无论什么原因,transport 都无法连接到 base),它就会被放到队列的后面,这显然是一个问题。

是否可以“阻止”芹菜队列,即。继续重试相同的任务,直到它成功或达到最大重试阈值,然后才移动到队列中的下一个任务?在我的情况下,我需要队列头部的任务继续尝试该 POST 直到它不再可以,并且在任何情况下都不应更改队列中任务的顺序,尽管我不确定这是否可以用 Celery 完成(如果是,如何)。

我遇到了这个先前的问题,它似乎描述了一个非常相似的问题,但它与我的用例并不完全相关。

标签: djangocelerydjango-celerycelery-task

解决方案


如果您的任务被链接在一起,celery 将在第一个任务完成之前处理后续任务。所以你可以这样做:

@task(bind=True, acks_late=True)
def retry_task(self, *args, **kwargs):
    try:
        # do stuff
    except PossibleExceptions:
        self.retry()

def next_task(*args, **kwargs):
    # foo

task_signature = retry_task.si() | next_task.si()
task_signature.apply_async()

请阅读有关重试的文档。自从我上次查看它以来,它有很多新功能。


推荐阅读