在Celery Task代码中处理错误的推荐方法是什么?

时间:2013-04-07 23:13:24

标签: python django rabbitmq celery django-celery

我一直在寻找几天来找到一个处理芹菜任务中的错误的事实方法。

在Celery文档中,我们了解了retying tasks because of failure

  

重要的是要注意工作人员不会崩溃,如果发生这种情况通常是一个不可恢复的错误,需要人为干预(工人或任务代码中的错误)。

...

  

因此,对于Python错误使用重试,如果您的任务是幂等的,那么如果需要该级别的可靠性,则将其与acks_late结合使用。

但是,如果由于逻辑错误我的任务有错误,那么盲目重试将无法解决问题。

在其他分布式系统中,我使用poison queue来存储消息,然后在修复错误后重新处理。用于路由的Celery文档非常强大,让我相信可以使用Celery手动完成类似的方法。

是否有推荐的方法在Celery中处理此问题?

1 个答案:

答案 0 :(得分:3)

来自文档:

  

retry()可用于重新执行任务,例如在可恢复错误的情况下。

我是逻辑故障,然后它不是可恢复的错误(如网络连接问题)。通过重试可能会使事情变得更糟。

话虽如此,您可以将routing_key="task.poisoned"传递给retry()调用,以确保所有重试的任务都放在特殊队列中(在本例中为“task.poisoned”但它可以是任何内容) )你没有工人约束。这将有效地将该任务置于不稳定状态,直到您修复该错误,然后手动启动工作人员以清除该队列。