处理RabbitMQ中的死信

Dan*_*Dan 11 messaging amqp rabbitmq dead-letter

TL; DR:一旦我修复了最初导致邮件被拒绝的消费者代码,我需要将死信信息"重播"回原始队列.

我为RabbitMQ配置了死信交换(DLX),并成功将拒绝的消息路由到死信队列.但现在我想查看死信队列中的消息,并尝试决定如何处理它们.一旦违规消费者代码被修复,这些消息中的一些(很多?)应该被重放(重新排队)到它们的原始队列(在"x-death"标题中可用).但是我该怎么做呢?我应该编写一个从死信队列中读取消息的一次性程序,并允许我指定一个目标队列来发送它们吗?那么搜索死信队列呢?如果我知道一条消息(比方说用JSON编码)有一个我想要搜索和重放的特定属性怎么办?例如,我修复了一个缺陷,我知道它将允许PacketId:1234消息现在成功处理.我想也可以为此写一个一次性的程序.

我当然不能成为第一个遇到这些问题的人,我想知道是否有其他人已经解决了这些问题.似乎应该有某种瑞士军刀用于此类事情.我在谷歌和Stack Overflow上进行了相当广泛的搜索,但并没有真正提出太多.我能找到的最接近的东西是铲子,但这看起来并不像是工作的正确工具.

Der*_*ley 8

我应该编写一个从死信队列中读取消息的一次性程序,并允许我指定一个目标队列来发送它们吗?

一般来说,是的.

您可以使用延迟消息交换插件的组合设置延迟重试以将消息重新发送回原始队列.

但是这只会在一个时间间隔内自动重试,并且在重试发生之前你可能没有解决问题.

在某些情况下这是可以的 - 就像错误是由外部资源暂时不可用引起的.

但是,在你的情况下,我相信你对创建应用程序来处理死信的想法是最好的方法,原因有以下几点:

  • 你需要搜索消息,这是不可能的RMQ
  • 这意味着您需要一个数据库来存储来自DLX /队列的消息

因为您要将消息从DLX /队列中拉出来,所以您需要确保从消息中获取所有标头信息,以便在时机成熟时重新发布到正确的队列.

我当然不能成为第一个遇到这些问题的人,我想知道是否有其他人已经解决了这些问题.

而你不是!

这个问题有很多解决方案,都归结为你提出的解决方案.

一些较大的"服务总线"实现已经内置了这种类型的功能.我相信NServiceBus(或它的SaaS版本)内置了这个 - 虽然我不是100%肯定它.

如果你想进一步研究这个问题,可以搜索"毒药信息"一词 - 这通常是用于这种情况的术语.我通过快速搜索在谷歌上发现了一些东西,这可能会帮助你走上正轨:

希望有所帮助!