RabbitMQ消息在第一次发送后未发送到死信
我们已经将队列配置为将死信消息(特别是nack'ed消息)发送到死信交换,该交换将它们按原始主题路由到各个死信队列。这一切都非常有效,当消息被nack'ed时,它们会被发送到正确的死信队列 当我们将这些消息从dlq铲回正常队列时,麻烦就来了,在那里它们会再次受到攻击。出于某种原因,这第二次他们只是消失了,而不是被送回死信交易所 我假设有某种“循环消息路由”检测正在进行,但找不到类似的东西。第二次通过检查消息会得到所有预期的头,所以我甚至不确定这样的事情是基于什么。任何关于下一步去哪里或者兔子是否有这样的东西的建议都将不胜感激RabbitMQ消息在第一次发送后未发送到死信,rabbitmq,pika,rabbitmq-exchange,rabbitmq-shovel,Rabbitmq,Pika,Rabbitmq Exchange,Rabbitmq Shovel,我们已经将队列配置为将死信消息(特别是nack'ed消息)发送到死信交换,该交换将它们按原始主题路由到各个死信队列。这一切都非常有效,当消息被nack'ed时,它们会被发送到正确的死信队列 当我们将这些消息从dlq铲回正常队列时,麻烦就来了,在那里它们会再次受到攻击。出于某种原因,这第二次他们只是消失了,而不是被送回死信交易所 我假设有某种“循环消息路由”检测正在进行,但找不到类似的东西。第二次通过检查消息会得到所有预期的头,所以我甚至不确定这样的事情是基于什么。任何关于下一步去哪里或者兔子是否
如果有必要,我们的消费者将使用python编写,使用pika库进行通信。假设您有以下队列/交换: 交换
-您的主交换全球交换
-另一种专门针对死信的交换DLX
-您在队列
。包含全局交换中的主队列
arguments=x-dead-letter-exchange:'DLX'
-您在queue.dlq
global\u exchange中的死信队列
routing_键绑定到test_消息
和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