TL; DR:修复了最初导致拒绝消息的使用者代码后,我需要将死信消息“重播”回其原始队列。

我已经为RabbitMQ配置了死信交换(DLX),并且已成功将拒绝的邮件路由到死信队列。但是,现在我想看看死信队列中的消息,并尝试决定如何处理每个消息。一旦解决了有问题的使用者代码,这些消息中的某些(许多?)应重放(重新排队)到其原始队列(可在“x-death” header 中找到)。但是我实际上该怎么做呢?我是否应该编写一个一次性程序,以从死信队列中读取消息并允许我指定目标队列以将其发送到?那搜索死信队列呢?如果我知道一条消息(假设它是用JSON编码)具有我想要搜索并重播的某个属性,该怎么办?例如,我修复了一个已知会允许成功处理PacketId:1234的消息的缺陷。我还可以为此编写一个一次性程序。

我当然不能成为第一个遇到这些问题的人,我想知道是否还有其他人已经解决了这些问题。似乎应该为这种事情使用某种瑞士军刀。我在Google和Stack Overflow上进行了相当广泛的搜索,但实际上并没有提出太多建议。我能找到的最接近的东西是铁锹,但这似乎并不是工作的正确工具。

最佳答案



一般来说,是的。

您可以结合使用delay message exchange plugin来设置延迟重试,以将消息重新发送回原始队列。

但这只会间隔一定时间自动执行重试,并且在重试发生之前您可能还没有解决问题。

在某些情况下,这是可以的-例如,由于外部资源暂时不可用而导致错误时。

不过,就您的情况而言,我认为您对创建处理死信的应用程序的想法是最好的选择,原因有以下几个:

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

    因为要将消息从DLX/队列中拉出,所以需要确保从消息中获取所有 header 信息,以便可以在时间到时将其重新发布到正确的队列中。



    而你不是!

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

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

    如果您想进一步研究,请搜索“毒药消息”一词-通常是在这种情况下使用的术语。通过快速搜索,我在Google上发现了一些东西,这可能会帮助您解决问题:
  • http://lists.rabbitmq.com/pipermail/rabbitmq-discuss/2013-January/025019.html
  • https://web.archive.org/web/20170809194056/http://tafakari.co.ke/2014/07/rabbitmq-poison-messages/
  • https://web.archive.org/web/20170809170555/http://kjnilsson.github.io/blog/2014/01/30/spread-the-poison/

  • 希望对您有所帮助!

    关于rabbitmq - 处理RabbitMQ中的死信,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36186578/

    10-16 02:16