2

我们已经将队列配置为将死信消息(特别是已确认消息)发送到死信交换器,该交换器按其原始主题将它们路由到各个死信队列。这一切都很好,当消息被确认时,它们被发送到正确的死信队列。

当我们将这些消息从 dlq 铲回正常队列时,麻烦就来了,在那里它们又被 nack 了。出于某种原因,第二次通过它们只是消失了,而不是被送回了死信交换。

我假设正在进行某种“循环消息路由”检测,但找不到类似的东西。第二次检查消息会给出所有预期的标题,所以我不确定这样的事情甚至可以基于什么。任何关于下一步看哪里或兔子是否有这样的东西的建议将不胜感激!

如果有必要,我们的消费者是用 python 编写的,使用 pika 库进行通信。

4

1 回答 1

2

假设您有以下队列/交换:

交流

  • global_exchange- 你的主要交易所
  • DLX- 另一个专门针对死信的交换

队列

  • queue- 您的主队列在global_exchange. 包含arguments=x-dead-letter-exchange: 'DLX'
  • queue.dlq- 你的死信队列global_exchange

绑定

  • test_messagerouting_key 绑定到queuequeue.dlq

最后,我假设您正在使用queue.dlq管理页面上的铲子插件,将消息从以下位置移动queue.dlqqueue

在此处输入图像描述

当您使用test_messageasrouting_key向发送消息时,路由的工作方式如下global_exchange

  1. 消息queue从绑定开始test_message
  2. 消费者 nack 的(nack 或拒绝无关紧要)消息,因此死信
  3. x-dead-letter-exchange参数将其发送到DLXwithrouting_key= test_message
  4. 由于queue.dlq绑定,该队列接收消息

当您使用该特定管理面板将消息铲回queue时,它使用默认交换。这会更改路由键。所以第二次收到的消息有一个路由键,它等于你要进入的队列的名称。

由于您没有x-dead-letter-routing-key配置,因此该消息将死信发送到当前路由键

如果未设置,则将使用消息自己的路由键。

所以在铲子的结果上,它是这样路由的:

  1. 消息出现queuerouting_key = queue
  2. 由于没有配置 x-dead-letter-routing-key ,它的死信DLXrouting_key = queue
  3. 没有绑定到queuein DLX,消息被丢弃

有两种潜在的解决方法:

  1. 添加另一个绑定queue.dlqrouting_key = queue
  2. 手动将x-dead-letter-routing-keyon配置queue为始终在死信上发送到相同的路由键,无论最初发送的是什么消息,并确保在其中绑定到它DLX
于 2020-08-03T22:44:23.847 回答