代码之家  ›  专栏  ›  技术社区  ›  Derek

错误队列中的MassTransit重定向消息

  •  1
  • Derek  · 技术社区  · 9 年前

    我将使用 NService总线 我偶然发现了一个功能,我希望船上有 MassTransit公司 (因为这是一项免费服务)。

    该功能基于 “中毒” 信息。

    如果由于系统中的错误,这些消息无法处理,并最终永久保存在 错误队列 .

    NService总线 有一个很酷的功能,在您纠正代码中的错误后,允许错误队列中的消息 重定向 '到原始工作队列,将 重新交付的 .

    这是通过使用NServiceBus特定工具完成的:- 返回到源队列.exe .

    MassTransit是否有类似的工具来解决此类问题?

    或者是否有其他可用的解决方法,最好是与RabbitMQ一起使用。

    2 回复  |  直到 9 年前
        1
  •  7
  •   Chris Patterson    9 年前

    使用RabbitMQ,很容易在队列之间移动消息。通过安装 shovel 插件。

    Move Messages

    您还可以在RabbitMQ中创建调度好的铲,并根据该调度执行消息移动。在RabbitMQ中配置铲子的可见性对我们的操作人员来说是非常宝贵的,因为他们很少认为Windows Scheduled Task(或其他随机调度器)会像将以前失败的消息移回生产队列那样冒险。

    我建议阅读这篇关于MassTransit如何处理有毒信息的博文: Error Handling in MassTransit with RabbitMQ

    RabbitMQ的工具比MSMQ提供的任何工具都要好得多,这也是我们完全放弃MSMQ进行生产排队的原因之一。

        2
  •  2
  •   Derick Bailey    9 年前

    只需RabbitMQ和一些代码,即可轻松地重新创建此功能。虽然NServicebus包含它很好,但使用MassTransit构建它应该很容易。

    (注意:我已经几年没有使用.NET了,所以我对NSB和MT的了解有点生疏……这将是一个高级答案,没有代码)

    首先,需要正确配置死信交换和有害消息队列。 https://www.rabbitmq.com/dlx.html

    一旦您知道消息导致错误并且是错误消息,您可以拒绝或否定(无需重新排队)该消息,以便通过死信交换(DLX)发送它。

    消息通过DLX后,您将拥有该消息的一些其他属性,包括:

    • queue(队列)-消息在没有固定字母之前所在的队列的名称,
    • exchange(交换)-消息发布到的交换(注意,如果消息多次使用死信,则这将是死信交换),
    • 路由密钥-消息发布时使用的路由密钥(包括CC密钥,但不包括BCC密钥),

    还有更多,但这些是您需要注意的。通过检查消息的这些属性,您可以使用原始路由密钥通过原始交换重新发送原始消息。或者,您可以直接重新发送到原始目标队列……我个人认为,通过交换发送会更好,因为原始队列可能不再存在(取决于系统配置、消费者创建独占队列等)。

    有了这些信息,重新创建特征集应该不会太困难。rabbitmq提供了您需要的所有功能,您只需编写一些代码就可以利用它。