我有一个 Celery 任务,它会在失败时重试,并出现指数退避。此任务将 Django 应用程序(称为"传输"(接收的消息发布到第二个 Django 应用程序(称为"base"(进行处理。这些消息必须按顺序处理,因此必须保持任务排队的顺序。但是,当任务失败时(因为传输由于某种原因无法连接到基(,它被降级到队列的后面,这显然是一个问题。
是否可以"阻止"Celery队列,即继续重试相同的任务,直到它成功或达到最大重试阈值,然后才移动到队列中的下一个任务?就我而言,我需要队列顶部的任务继续尝试该 POST,直到它不能再尝试,并且在任何情况下都不应更改队列中任务的顺序,尽管我不确定这是否可以用 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()
请阅读有关重试的文档。自从我上次看它以来,它有很多新功能。