rabbitmq - 目标系统长时间停机时的 MassTransit 消费者故障处理
问题描述
我已经阅读了有关错误处理和故障的 MT 文档,并放置了一些代码来发布故障,并编写了一个故障使用者来在使用 Polly 重试几次后收听故障消息。
我有一个队列消费者使用 MassTranasit 从 RabbitMQ 获取消息,并通过 Http api 发送到云系统。我已经处理了所有可能的异常,并将 http 调用包装在 Polly 重试中,以解决暂时的网络错误。但是这种方法的问题是,在重试用尽后,消息实际上被放弃了处理。
如果目标系统停机 10 小时(我们之前不知道这种中断,否则我将计划停止消费者服务),我们可以使用 MassTransit 停止将消息从队列拉入消费者的最佳策略是什么?有没有办法我们可以根据失败次数等停止接收消息?
谢谢
解决方案
你需要一个断路器,这是分布式系统中众所周知的模式。当远程系统在负载下挣扎并且向它发出更多请求时,断路器会激活,这可能会扼杀它。它还允许您在远程系统关闭时停止向远程系统发送消息。
断路器在 MassTransit中开箱即用。
我也不建议在消费者中使用 Polly 实现重试。MassTransit 有一套全面的重试策略,它还允许 MassTransit 了解消费者中发生了多少故障,这在您使用 Polly 时不可用。例如,断路器中间件不会知道 Polly 包装的调用中的失败,因此不会做出正确的反应。
如果远程系统长时间停机(如您所描述的几个小时),任何尝试次数有限的重试策略最终都会失败。断路器将打开,但它会不时重置并尝试再次发送呼叫消费者。否则,它永远不会知道远程系统何时恢复。因此,您要么需要从错误队列中恢复消息,要么需要添加重新传递中间件。
因此,您可以通过以下方式配置接收管道:
重新交付 -> 断路器 -> 重试 -> 消费者
推荐阅读
- typo3 - 全新安装最新的 TYPO3 9.5 LTS 后无法登录后端
- java - 为什么我的程序在获取字符串而不是字符时会自行终止?
- python - 如何在python中比较两个字典
- javascript - Canvas.getContext 未定义
- c++ - 具有递归和多个类的 C++ 河内塔
- r - 在同一个ggplot上绘制来自不同列的数据
- angular - 加入集合数组结果中的对象
- windows - 在工作站锁定时切换 NUMLOCK / CAPSLOCK / SCROLLLOCK?
- python - Python - 如何使用 Scipy.Stats.Multivariate_Normal 生成高斯随机向量
- lisp - LISP--传递一个结构组件,而不是组件的值