RabbitMQ消息在第一次发送后未发送到死信

RabbitMQ消息在第一次发送后未发送到死信,rabbitmq,pika,rabbitmq-exchange,rabbitmq-shovel,Rabbitmq,Pika,Rabbitmq Exchange,Rabbitmq Shovel,我们已经将队列配置为将死信消息(特别是nack'ed消息)发送到死信交换,该交换将它们按原始主题路由到各个死信队列。这一切都非常有效,当消息被nack'ed时,它们会被发送到正确的死信队列 当我们将这些消息从dlq铲回正常队列时,麻烦就来了,在那里它们会再次受到攻击。出于某种原因,这第二次他们只是消失了,而不是被送回死信交易所 我假设有某种“循环消息路由”检测正在进行,但找不到类似的东西。第二次通过检查消息会得到所有预期的头,所以我甚至不确定这样的事情是基于什么。任何关于下一步去哪里或者兔子是否

我们已经将队列配置为将死信消息(特别是nack'ed消息)发送到死信交换,该交换将它们按原始主题路由到各个死信队列。这一切都非常有效,当消息被nack'ed时,它们会被发送到正确的死信队列

当我们将这些消息从dlq铲回正常队列时,麻烦就来了,在那里它们会再次受到攻击。出于某种原因,这第二次他们只是消失了,而不是被送回死信交易所

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


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

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

交换
  • 全球交换
    -您的主交换
  • DLX
    -另一种专门针对死信的交换
排队
  • 队列
    -您在
    全局交换中的主队列
    。包含
    arguments=x-dead-letter-exchange:'DLX'
  • queue.dlq
    -您在
    global\u exchange中的死信队列
绑定
  • test_消息
    routing_键绑定到
    queue
    queue.dlq
最后,我假设您正在使用
queue.dlq
管理页面上的铲子插件,将消息从
queue.dlq
移动到
queue

以下是使用
test\u message
作为
routing\u键向
global\u-exchange
发送消息时,路由的工作原理:

  • 消息从
    test\u消息的绑定进入
    队列
  • 消费者的nack(nack或reject不重要)消息,因此它是死信
  • x-dead-letter-exchange
    参数使用
    routing\u key=test\u消息将其发送到
    DLX
  • 由于
    queue.dlq
    绑定,该队列接收消息
  • 当您使用特定的管理面板将消息铲回
    队列时,它使用。这会更改路由密钥。因此,消息的第二次接收具有一个路由密钥,该密钥等于您要铲入的队列的名称

    由于您未配置
    x-dead-letter-routing-key
    ,因此该消息将以死信形式发送至:

    如果未设置,则将使用邮件自己的路由密钥

    根据电铲的结果,其路径如下:

  • 消息显示在
    队列
    中,带有
    路由_key=queue
  • 由于没有配置x-dead-letter-routing-key,因此使用
    routing_key=queue
  • 未绑定到
    DLX
    中的
    队列
    ,消息已丢弃
  • 有两种可能的解决办法:

  • 将另一个绑定添加到
    queue.dlq
    routing\u key=queue
  • 手动配置
    queue
    上的
    x-dead-letter-routing-key
    ,使其始终发送到dead-letter上的同一路由密钥,而不管最初发送给它的是什么消息,并确保在
    DLX