我一直在寻找几天来找到一个处理芹菜任务中的错误的事实方法。
在Celery文档中,我们了解了retying tasks because of failure。
重要的是要注意工作人员不会崩溃,如果发生这种情况通常是一个不可恢复的错误,需要人为干预(工人或任务代码中的错误)。
...
因此,对于Python错误使用重试,如果您的任务是幂等的,那么如果需要该级别的可靠性,则将其与acks_late结合使用。
但是,如果由于逻辑错误我的任务有错误,那么盲目重试将无法解决问题。
在其他分布式系统中,我使用poison queue
来存储消息,然后在修复错误后重新处理。用于路由的Celery文档非常强大,让我相信可以使用Celery手动完成类似的方法。
是否有推荐的方法在Celery中处理此问题?
答案 0 :(得分:3)
来自文档:
retry()可用于重新执行任务,例如在可恢复错误的情况下。
我是逻辑故障,然后它不是可恢复的错误(如网络连接问题)。通过重试可能会使事情变得更糟。
话虽如此,您可以将routing_key="task.poisoned"
传递给retry()调用,以确保所有重试的任务都放在特殊队列中(在本例中为“task.poisoned”但它可以是任何内容) )你没有工人约束。这将有效地将该任务置于不稳定状态,直到您修复该错误,然后手动启动工作人员以清除该队列。