首页 > 解决方案 > 目标系统长时间停机时的 MassTransit 消费者故障处理

问题描述

我已经阅读了有关错误处理和故障的 MT 文档,并放置了一些代码来发布故障,并编写了一个故障使用者来在使用 Polly 重试几次后收听故障消息。

我有一个队列消费者使用 MassTranasit 从 RabbitMQ 获取消息,并通过 Http api 发送到云系统。我已经处理了所有可能的异常,并将 http 调用包装在 Polly 重试中,以解决暂时的网络错误。但是这种方法的问题是,在重试用尽后,消息实际上被放弃了处理。

如果目标系统停机 10 小时(我们之前不知道这种中断,否则我将计划停止消费者服务),我们可以使用 MassTransit 停止将消息从队列拉入消费者的最佳策略是什么?有没有办法我们可以根据失败次数等停止接收消息?

谢谢

标签: rabbitmqmasstransit

解决方案


你需要一个断路器,这是分布式系统中众所周知的模式。当远程系统在负载下挣扎并且向它发出更多请求时,断路器会激活,这可能会扼杀它。它还允许您在远程系统关闭时停止向远程系统发送消息。

断路器在 MassTransit中开箱即用。

我也不建议在消费者中使用 Polly 实现重试。MassTransit 有一套全面的重试策略,它还允许 MassTransit 了解消费者中发生了多少故障,这在您使用 Polly 时不可用。例如,断路器中间件不会知道 Polly 包装的调用中的失败,因此不会做出正确的反应。

如果远程系统长时间停机(如您所描述的几个小时),任何尝试次数有限的重试策略最终都会失败。断路器将打开,但它会不时重置并尝试再次发送呼叫消费者。否则,它永远不会知道远程系统何时恢复。因此,您要么需要从错误队列中恢复消息,要么需要添加重新传递中间件。

因此,您可以通过以下方式配置接收管道:

重新交付 -> 断路器 -> 重试 -> 消费者


推荐阅读