TL; DR:我需要"重播"一旦我修复了最初导致邮件被拒绝的消费者代码,死信就会回到原来的队列中。
我为RabbitMQ配置了死信交换(DLX),并成功将拒绝的消息路由到死信队列。但现在我想查看死信队列中的消息,并尝试决定如何处理它们。一旦违规的消费者代码被修复,这些消息中的一些(很多?)应该被重放(重新排列)到它们的原始队列(在" x-death"标题中可用)。但是我该怎么做呢?我应该编写一个从死信队列中读取消息的一次性程序,并允许我指定一个目标队列来发送它们吗?那么搜索死信队列呢?如果我知道一条消息(让我们说用JSON编码的话)具有我想要搜索和重放的特定属性,该怎么办?例如,我修复了一个缺陷,我知道它将允许PacketId:1234消息现在成功处理。我想也可以为此写一个一次性程序。
我当然不能成为第一个遇到这些问题的人,我想知道其他人是否已经解决了这些问题。似乎应该有某种瑞士军刀用于此类事情。我在Google和Stack Overflow上进行了相当广泛的搜索,但并没有真正想出多少。我能找到的最接近的东西是铲子,但这看起来并不像是工作的正确工具。
答案 0 :(得分:7)
我是否应该编写一个从死信队列中读取消息的一次性程序,并允许我指定一个目标队列来发送它们?
一般来说,是的。
您可以设置延迟重试,使用delay message exchange plugin的组合将邮件重新发送回原始队列。
但是这只会在一个时间间隔内自动重试,并且在重试发生之前你可能没有解决问题。
在某些情况下这是可以的 - 就像外部资源暂时不可用导致错误一样。
但是,在您的情况下,我相信您对创建处理死信的应用程序的想法是最好的方法,原因如下:因为您要将消息从DLX /队列中拉出来,所以您需要确保从消息中获取所有标头信息,以便在时机成熟时重新发布到正确的队列。
我当然不能成为第一个遇到这些问题的人,我想知道其他人是否已经解决了这些问题。
而你却不是!
这个问题有很多解决方案,都归结为你建议的解决方案。
一些较大的“服务总线”实现已经内置了这种类型的功能。我相信NServiceBus(或它的SaaS版本)内置了这个 - 虽然我不是100%肯定它。
如果你想进一步研究这个问题,可以搜索“毒药信息”一词 - 这通常是用于这种情况的术语。我在谷歌上发现了一些快速搜索的东西,这可能会帮助你走上正轨:
希望有所帮助!