1

我正在浏览一些使用NServiceBus的示例,并且偶然发现了我希望MassTransit附带的一个功能(因为它是一项免费服务)。

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

如果由于您的系统中的错误,这些消息永远无法处理,并最终永久地出现在错误队列中。

NServiceBus有一个很酷的功能,一旦您纠正了代码中的错误,就可以将错误队列中的这些消息“重定向”到原始工作队列,然后重新传递

这是通过使用 NServiceBus 特定工具来完成的:- ReturnToSourceQueue.exe

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

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

4

2 回答 2

7

使用 RabbitMQ,可以轻松地在队列之间移动消息。您可以通过安装shovel插件使用管理控制台手动执行此操作。

移动消息

您还可以在 RabbitMQ 中创建计划的铲子,并执行消息移动以响应该计划。在 RabbitMQ 中配置铲子的可见性对我们的操作人员来说非常宝贵,因为他们很少认为 Windows 计划任务(或其他随机调度程序)会做一些像将先前失败的消息移回生产队列一样危险的事情.

我建议阅读这篇关于 MassTransit 如何处理有毒消息的博客文章:使用 RabbitMQ 在 MassTransit 中进行错误处理

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

于 2015-08-01T16:05:32.880 回答
2

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

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

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

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

消息通过 DLX 后,您将在消息上拥有一些附加属性,包括:

  • queue - 消息在死信之前所在的队列的名称,
  • exchange - 消息发布到的交易所(请注意,如果消息多次出现死信,这将是死信交换),
  • routing-keys - 发布消息时使用的路由密钥(包括 CC 密钥,但不包括 BCC 密钥),

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

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

于 2015-07-31T15:08:09.303 回答