处理RabbitMQ中的死信

时间:2016-03-23 19:01:11

标签: rabbitmq messaging amqp dead-letter

TL; DR:我需要"重播"一旦我修复了最初导致邮件被拒绝的消费者代码,死信就会回到原来的队列中。

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

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

1 个答案:

答案 0 :(得分:7)

  

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

一般来说,是的。

您可以设置延迟重试,使用delay message exchange plugin的组合将邮件重新发送回原始队列。

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

在某些情况下这是可以的 - 就像外部资源暂时不可用导致错误一样。

但是,在您的情况下,我相信您对创建处理死信的应用程序的想法是最好的方法,原因如下:

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

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

  

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

而你却不是!

这个问题有很多解决方案,都归结为你建议的解决方案。

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

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

希望有所帮助!