RabbitMQ,死信交换-> 无法将消息路由到默认交换?

Posted

技术标签:

【中文标题】RabbitMQ,死信交换-> 无法将消息路由到默认交换?【英文标题】:RabbitMQ, dead letters exchanges -> Can't route message to the default exchange? 【发布时间】:2012-12-17 23:54:35 【问题描述】:

使用 RabbitMQ Admin (v3),我尝试创建一个将死信消息发送到默认交换器的队列,其中绑定了一个错误队列的路由键“MyErrorRoutingKey”。 所以在管理界面,我把“死信交换”留空了。

我只是想知道在尝试创建队列时出现以下消息是否正常:

406 PRECONDITION_FAILED - arg 'x-dead-letter-routing-key' 无效 vhost '/' 中的队列 'MyQueue':routing_key_but_no_dlx_defined

似乎可以将死信消息路由到默认交换,因为在文档中进一步说明:

可以形成死信队列的循环。例如, 当队列死信消息发送到默认值时,可能会发生这种情况 在不指定死信路由键的情况下进行交换。中的消息 这样的循环(即两次到达同一队列的消息)将是 掉了。

那么我应该如何将消息路由到默认交换器?与上面描述的“循环无用死信”不同,我希望能够指定路由键,这样我的消息就不会丢失。

【问题讨论】:

【参考方案1】:

在我看来,routing_key_but_no_dlx_defined 说如果你没有定义死信交换,你不应该定义死信路由键,这也是有道理的。

我不确定你想用默认交换做什么,但它也有一个名字,所以也许你也可以设置死信交换......

关于您从文档中引用的最后一句话,这意味着如果您使用死信交换设置了一个循环,即:

QUEUE-A > DEAD-LETTER-QUEUE > QUEUE-A

...如果由于超时而离开 DEAD-LETTER-QUEUE,RabbitMQ 将在消息返回到 QUEUE-A 时丢弃该消息。 如果您想要这样的延迟重试,您现在必须手动将您的消息排队到 DEAD-LETTER-QUEUE,但有迹象表明 RabbitMQ 以后可能会让您有这样的周期 (http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-April/026489.html)。

【讨论】:

【参考方案2】:

老问题,但似乎没有人回答,所以我会试一试。

我在使用 Web UI 时遇到了完全相同的错误,但我可以通过手动将“x-dead-letter-exchange”和“x-dead-letter-routing-key”设置为自定义参数,而不是使用提供的字段。

【讨论】:

以上是关于RabbitMQ,死信交换-> 无法将消息路由到默认交换?的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ死信交换永远不会得到消息

RabbitMQ 利用消息超时和死信交换机实现定时任务

RabbitMQ死信队列DLX应用

在 RabbitMQ 中需要单独的死信交换吗?

RabbitMQ学习教程二(交换机,死信队列)

死信交换 RabbitMQ 丢弃消息