来自错误队列的 MassTransit 重定向消息
MassTransit Redirect Messages from the Error Queue
我正在使用 NServiceBus 进行一些示例,我偶然发现了一个我希望 MassTransit 附带的功能(因为它是一项免费服务)。
该功能基于 'poisoned' 消息。
如果由于您系统中的错误,这些消息永远无法处理,并最终永久进入错误队列。
NServiceBus 有一个很酷的功能,一旦你纠正了代码中的错误,就允许错误队列中的那些消息被“重定向' 到原来的工作队列,待重新传送.
这是通过使用 NServiceBus 特定工具完成的:- ReturnToSourceQueue.exe.
MassTransit 是否有针对此类问题的类似工具?
或者是否有其他可用的解决方法,最好与 RabbitMQ 一起使用。
只需使用 RabbitMQ 和一些代码即可轻松重新创建此功能。虽然 NServicebus 包含它很好,但使用 MassTransit 构建它应该很容易。
(注意:我已经好几年没用过 .NET 了,所以我对 NSB 和 MT 的了解有点生疏...这只是高级答案,没有代码)
首先要正确配置死信交换和毒消息队列。 https://www.rabbitmq.com/dlx.html
一旦您知道消息导致错误并且是错误消息,您可以拒绝或拒绝(不重新排队)消息以便通过死信交换 (DLX) 发送它。
消息通过 DLX 后,消息将具有一些附加属性,包括:
- queue - 消息在成为死信之前所在的队列的名称,
- exchange - 消息被发布到的交换(请注意,如果消息多次死信,这将是一个死信交换),
- routing-keys - 消息发布时使用的路由密钥(包括 CC 密钥但不包括 BCC 密钥),
还会有更多,但这些是你要注意的。通过检查消息的这些属性,您可以使用原始路由键通过原始交换重新发送原始消息。或者,您可以直接重新发送到原始目标队列...我个人认为通过交换发送会更好,因为原始队列可能不再存在(取决于系统配置、消费者创建独占队列等)。
有了这些信息,重新创建功能集应该不会太困难。 rabbitmq 提供了您需要的所有功能,您只需编写一些代码即可利用它。
使用 RabbitMQ,可以轻松地在队列之间移动消息。您可以通过安装 shovel
插件,使用管理控制台手动执行此操作。
您还可以在计划好的 RabbitMQ 中创建铲子,并根据该计划执行消息移动。在 RabbitMQ 中配置铲子的可见性对我们的操作人员来说是无价的,因为他们很少认为 Windows 计划任务(或其他随机调度程序)会做一些与将先前失败的消息移回一样有风险的事情进入生产队列。
我建议阅读此博客 post,了解 MassTransit 如何处理有害消息:Error Handling in MassTransit with RabbitMQ
围绕 RabbitMQ 的工具比 MSMQ 提供的任何工具都要好得多,这也是我们完全放弃 MSMQ 转而使用生产队列的原因之一。
我正在使用 NServiceBus 进行一些示例,我偶然发现了一个我希望 MassTransit 附带的功能(因为它是一项免费服务)。
该功能基于 'poisoned' 消息。
如果由于您系统中的错误,这些消息永远无法处理,并最终永久进入错误队列。
NServiceBus 有一个很酷的功能,一旦你纠正了代码中的错误,就允许错误队列中的那些消息被“重定向' 到原来的工作队列,待重新传送.
这是通过使用 NServiceBus 特定工具完成的:- ReturnToSourceQueue.exe.
MassTransit 是否有针对此类问题的类似工具?
或者是否有其他可用的解决方法,最好与 RabbitMQ 一起使用。
只需使用 RabbitMQ 和一些代码即可轻松重新创建此功能。虽然 NServicebus 包含它很好,但使用 MassTransit 构建它应该很容易。
(注意:我已经好几年没用过 .NET 了,所以我对 NSB 和 MT 的了解有点生疏...这只是高级答案,没有代码)
首先要正确配置死信交换和毒消息队列。 https://www.rabbitmq.com/dlx.html
一旦您知道消息导致错误并且是错误消息,您可以拒绝或拒绝(不重新排队)消息以便通过死信交换 (DLX) 发送它。
消息通过 DLX 后,消息将具有一些附加属性,包括:
- queue - 消息在成为死信之前所在的队列的名称,
- exchange - 消息被发布到的交换(请注意,如果消息多次死信,这将是一个死信交换),
- routing-keys - 消息发布时使用的路由密钥(包括 CC 密钥但不包括 BCC 密钥),
还会有更多,但这些是你要注意的。通过检查消息的这些属性,您可以使用原始路由键通过原始交换重新发送原始消息。或者,您可以直接重新发送到原始目标队列...我个人认为通过交换发送会更好,因为原始队列可能不再存在(取决于系统配置、消费者创建独占队列等)。
有了这些信息,重新创建功能集应该不会太困难。 rabbitmq 提供了您需要的所有功能,您只需编写一些代码即可利用它。
使用 RabbitMQ,可以轻松地在队列之间移动消息。您可以通过安装 shovel
插件,使用管理控制台手动执行此操作。
您还可以在计划好的 RabbitMQ 中创建铲子,并根据该计划执行消息移动。在 RabbitMQ 中配置铲子的可见性对我们的操作人员来说是无价的,因为他们很少认为 Windows 计划任务(或其他随机调度程序)会做一些与将先前失败的消息移回一样有风险的事情进入生产队列。
我建议阅读此博客 post,了解 MassTransit 如何处理有害消息:Error Handling in MassTransit with RabbitMQ
围绕 RabbitMQ 的工具比 MSMQ 提供的任何工具都要好得多,这也是我们完全放弃 MSMQ 转而使用生产队列的原因之一。