首页 > 解决方案 > 芹菜工人失败任务重新排队逻辑(RabbitMQ)

问题描述

我有以下设置:

celery version = 4.2.1
task_reject_on_worker_lost = True
task_acks_late = True

我试图让消息最初路由到“QueueA”,如果正在处理它的芹菜工人突然失败,我希望消息重新排队到新的队列“QueueB”。是否可以通过调整我的 RabbitMQ 队列设置或通过 celery 来做到这一点?

我已经为 QueueA 正确配置了一个死信交换,它处理这种类型的路由,例如 TTL(即消息进入 QueueA 直到 TTL 然后进入死信队列并最终返回 QueueB)。

标签: pythonrabbitmqcelery

解决方案


来自RabbitMQ 邮件列表

通道(以及连接)关闭时的自动重新排队总是发生在同一个队列1上。这种情况不会导致死字,任何 DLX 设置都不会产生任何影响。使用 3.8 中的仲裁队列,自动重新排队有时会导致死信,因为有一个可选的重新传递计数限制。那将接近您正在寻找的内容。由于仲裁队列不是 RabbitMQ 3.7 中可用的功能,因此该功能也不是。3.8.0 目前为 beta.3 [2],将于 2019 年年中发布。1. https://www.rabbitmq.com/confirms.html 2. https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.8.0-beta.3 此处记录了重新投递限制(https ://next.rabbitmq.com/quorum-queues.html)


推荐阅读