1

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

在 Celery 文档中,我们确实了解了由于失败而重新绑定任务

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

...

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

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

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

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

4

1 回答 1

3

从文档:

retry() 可用于重新执行任务,例如在发生可恢复错误时。

I 这是逻辑故障,则不是可恢复的错误(如网络连接问题)。重试可能只会让事情变得更糟。

话虽如此,您可以传递routing_key="task.poisoned"给 retry() 调用,以确保所有重试的任务都放在一个特殊的队列中(在本例中为“task.poisoned”,但它可以是任何东西),您没有绑定任何工作人员. 这将有效地将该任务停在边缘,直到您修复错误然后手动启动工作人员以清除该队列。

于 2013-04-08T05:46:17.920 回答