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