目标系统长时间停机时的MassTransit消费者故障处理
MassTransit consumer fault handling when the destination system is down for long time
我已经阅读了关于错误处理和故障的 MT 文档,并编写了一些代码来发布故障,并编写了一个故障使用者以在使用 Polly 重试一些次数后收听故障消息。
我有一个队列消费者使用 MassTranasit 从 RabbitMQ 获取消息并通过 Http api 发送到云系统。我已经处理了所有可能的异常,并且还在 Polly 中包装了 http 调用以重试暂时性网络错误。但这种方法的问题是,在重试次数耗尽后,消息实际上被放弃处理了。
如果目标系统停机 10 小时假设(我们之前不知道这次中断,否则我将计划消费者服务停止),我们可以与 MassTransit 一起停止从中提取消息的最佳策略是什么排队进入消费者?有没有一种方法可以根据失败次数等停止接收消息?
谢谢
你需要一个断路器,它是分布式系统中的 well-known 模式。当远程系统在负载下挣扎并且向它提出更多请求可能会扼杀它时,断路器会激活。它还允许您在远程系统关闭时停止向远程系统发送消息。
断路器 available in MassTransit 开箱即用。
我也不建议在消费者中使用 Polly 实现重试。 MassTransit 有一套全面的重试策略,它还允许 MassTransit 了解消费者中发生了多少次故障,这是使用 Polly 时无法获得的。例如,断路器中间件不会知道 Polly-wrapped 调用中的失败,因此不会做出正确的反应。
如果远程系统停机时间很长(如您所述的几个小时),任何尝试次数有限的重试策略最终都会失败。断路器将打开,但它会不时重置并尝试再次发送呼叫消费者。否则,它永远不知道远程系统何时恢复。因此,您要么需要从错误队列中恢复消息,要么添加 redelivery 中间件。
因此,您可以这样配置接收管道:
重新投递 -> 断路器 -> 重试 -> 消费者
我已经阅读了关于错误处理和故障的 MT 文档,并编写了一些代码来发布故障,并编写了一个故障使用者以在使用 Polly 重试一些次数后收听故障消息。
我有一个队列消费者使用 MassTranasit 从 RabbitMQ 获取消息并通过 Http api 发送到云系统。我已经处理了所有可能的异常,并且还在 Polly 中包装了 http 调用以重试暂时性网络错误。但这种方法的问题是,在重试次数耗尽后,消息实际上被放弃处理了。
如果目标系统停机 10 小时假设(我们之前不知道这次中断,否则我将计划消费者服务停止),我们可以与 MassTransit 一起停止从中提取消息的最佳策略是什么排队进入消费者?有没有一种方法可以根据失败次数等停止接收消息?
谢谢
你需要一个断路器,它是分布式系统中的 well-known 模式。当远程系统在负载下挣扎并且向它提出更多请求可能会扼杀它时,断路器会激活。它还允许您在远程系统关闭时停止向远程系统发送消息。
断路器 available in MassTransit 开箱即用。
我也不建议在消费者中使用 Polly 实现重试。 MassTransit 有一套全面的重试策略,它还允许 MassTransit 了解消费者中发生了多少次故障,这是使用 Polly 时无法获得的。例如,断路器中间件不会知道 Polly-wrapped 调用中的失败,因此不会做出正确的反应。
如果远程系统停机时间很长(如您所述的几个小时),任何尝试次数有限的重试策略最终都会失败。断路器将打开,但它会不时重置并尝试再次发送呼叫消费者。否则,它永远不知道远程系统何时恢复。因此,您要么需要从错误队列中恢复消息,要么添加 redelivery 中间件。
因此,您可以这样配置接收管道:
重新投递 -> 断路器 -> 重试 -> 消费者