RabbitMQ中的死字母死信

Ant*_*lev 4 rabbitmq dead-letter

这是我们在这里有的:

  • 主题交换DLE,旨在成为死信交换
  • 主题交换E,这是"主要"交易所
  • 几个队列(EQ1,...,EQn)绑定E(并初始化x-dead-letter-exchange = DLE),每个队列都有自己的路由密钥.这些队列是从中消耗的队列.
  • 对于每个EQn,有一个DLEQn(用x-dead-letter-exchange = E和初始化x-message-ttl = 5000),绑定到DLE相同的路由密钥EQn.这些队列没有被消耗掉

我想要的是以下内容:如果消费者无法处理消息EQn,它将消息Nack requeue: false并且它到达DLEQn- 也就是说,死信交换上的适当队列.现在,我想让这条消息DLEQn停留一段时间,然后再路由回原始队列EQn再次处理.

尽我所能,我无法将"重新传送到原始队列"工作.我看到消息中DLEQn包含所有正确的标题和路由密钥完好无损,但在TTL过期后它们就会消失得无影无踪.

我在这做错了什么?

jhi*_*den 8

是的,你可以这样做.我们目前在生产中这样做,效果很好.代码太长,不能包含在这里,但我会向您展示我创建的代表流程的图表.基本思想是第一个DLX有一个TTL,一旦TTL到期,消息就会进入第二个队列重新发送回原始状态.

在此输入图像描述

  • 一个单独的消费者从"重试重定向队列"中获取消息并查看兔子标题.感兴趣的标题是"x-death",在那里它有消息来自的交换和队列.我们使用它将消息发送回许多不同的队列,这样我们只需要一个"重试重定向队列".合理? (2认同)

pin*_*ain 5

RabbitMQ检测消息流循环(E-> DLE-> E-> DLE ...)并静默丢弃消息:

DLX手册(路由死信)部分

可能形成死信队列的循环。例如,当队列将邮件死信到默认交换而不指定死信路由键时,可能会发生这种情况。如果整个周期是由于消息到期,则将丢弃此类周期中的消息(即,两次到达同一队列的消息)。