设计可靠通信之设置合理的断路器(熔断器)

2022-08-29  本文已影响0人  robot_test_boy

在电子线路中,断路器起保护作用——防止电流过大产生更大范围的系统破坏。同样,断路器也是一种暂时停止向发生故障的服务发起请求来避免连锁故障的方法

断路器是如何工作的呢?有两大准则影响了断路器的设计:其一,在发生问题时,远程通信应该快速失败,而不要浪费资源等待永远不会到来的响应结果;其二,如果所依赖的服务持续出现故障,最好在该依赖服务恢复之前停止进一步发起请求。

当向一个服务发起请求时,可以跟踪请求成功或失败的次数。在每个服务实例内部跟踪这些数据,也可以使用外部缓存在多个服务中共用这些数据。在正常的操作中,我们认为断路器是闭合状态的

如果在一定时间窗口内失败数或者失败率超过某个阈值,断路器就会断开。这种情况下,服务就不再尝试向协作服务发起请求了,而是会绕过这个请求,并在可能的情况下执行适当的后备方案——返回一个桩消息、路由到其他服务或者返回缓存的数据。

FAQ:前面一段提到,可在下游服务内部或外部做请求失败次数统计。如果在下游服务内部统计,下游服务统一做熔断处理。如果在下游服务外部统计,则每个上游服务专门做熔断处理。

设置时间窗口和阈值需要认真考虑目标服务所期望的可靠性以及服务间交互的数量规模。如果请求比较少,那么断路器不会很有效,因为为了获取请求的典型样本,需要比较大的时间窗口。对于存在明显的高峰和低谷时间段的服务交互,我们会需要引入一个最小吞吐量来保证断路器只有在统计学意义上负载特别高的时候才会响应。

一旦断路器断开,肯定不希望一直这样。当服务的可用性恢复到正常状态时,就应该将断路器闭合了。断路器需要发送试验性的请求,以判断连接是否恢复到健康状态。在这个试验状态中,断路器处于半开状态(half open):如果调用成功,断路器就会闭合;否则,继续保持断开状态。与重试技术一样,应该利用带抖动的指数退避方法来安排这些尝试请求。

不要忘记断路器的正常状态是闭合状态!用断开(open)和闭合(close)来分别代表无效状态和有效状态这似乎违反直觉,但反映的是电路的真实表现。

摘取自 摩根·布鲁斯和保罗·A.佩雷拉的《微服务实战》

上一篇下一篇

猜你喜欢

热点阅读