Circuit Breaker模式

Circuit Breaker模式会处理一些需要一定时间来重连远程服务和远端资源的错误。该模式可以提高一个应用的稳定性和弹性。

问题

在类似于云的分布式环境中,当一个应用需要执行一些访问远程资源或者是远端服务的时候,是很容易碰到一些偶然的错误的,比如说,网络连接速度很慢,超时,或者是资源的过量使用,或者临时资源不再可用等等。这一类的错误通常来说会在短暂的时间内,自动恢复过来。一个健壮的云应用也该能够通过一些策略能够处理这类错误,比如使用重试模式。

然而,也有一些情况,错误是出于一些意想不到的事件,这类事件很难预期,而且需要消耗很多时间来自动恢复。这些错误在严重性上也从丢失部分连接到整个服务的失败。在这些情况下,让应用继续重试或者执行操作就已经没有意义了。相对的,应用应该迅速令服务失败,而根据错误类型来尝试采取对应的措施。

另外,如果一个服务非常繁忙,系统的部分错误有可能会导致雪崩效应。举例来说,一个操作其他服务的操作可以配置超时时间的,如果服务再一段时间无法应答,调用方可以返回错误信息的。然而这个策略可能导致大量针对这个服务的请求阻塞直至Timeout时间到了。这些阻塞的请求可能会持有系统关键的资源,比如内存,线程,数据库连接等等信息。因此,引用的资源也可能会被耗尽,造成系统内其他不相关部分得失败。在这些情况下,最好的方法是令这些配置超时的操作立刻失败,并且只有当服务可能成功的时候才去调用。当然,配置较短的超时时间也能改善这一问题,但是超时时间如果配置的太短,服务的调用反而会因为大量的超时而失败。

解决方案

Circuit-Breaker模式可以防止应用重复的尝试调用容易失败的操作,当Circuit-Breaker模式判断错误会持续的时候,它会令操作不再持续等待,以免继续浪费CPU资源。当然,Circuit-Breaker模式也令应用本身可以发现错误有没有被修复。如果发生的问题已经被修复了,应用可以重新尝试去调用服务。

Circuit-Breaker模式的目的和Retry模式的目的是不同的。Retry模式令应用不断的重试调用,直到最后成功。而Circuit-Breaker模式是阻止应用继续尝试无意义的请求。应用可以同时使用两种模式。然而,重试逻辑应用对于所有的Circuit-Breaker返回的异常十分敏感,这样可以在Circuit-Breaker发现错误短时间无法修复的情况下直接不再继续重试。

Circuit-Breaker的作用就好似可能失败操作的代理。代理会监控最近发生的错误,然后依据这一信息来决定是否允许操作的继续执行,或者直接立刻返回异常信息。

Circuit-Breaker可以按照如下的状态来模仿一个断路器来实现:

  • 关闭:应用的请求已经路由到了这个操作。代理应该维护最近一段时间的错误信息,如果调用操作失败,那么大力增加这个错误信息的数量。如果这个错误数量超过给定时间的阈值,代理进入到打开状态。这个时候,代理启动一个超时的Timer,当Timer过期了,代理则进入半开状态。

超时Timer的目的是为了给系统一段时间来自我修复之前碰到的问题。


  • 打开:令可能失败的外部调用操作立刻失败,所有的外部调用直接抛异常给应用。
  • 半开:只有一定数量的应用请求可以进行操作的调用。如果这些请求成功了,那么就假定之前发成的错误已经被系统自动修复了,而Circuit-Breaker转换成关闭状态(同时重置错误计数器)。如果任何请求失败了,那么Circuit-Breaker会假定错误仍然在存在,Circuit-Breaker会重新转换成打开状态,并重启超时Timer给系统更多的时间来自我修复错误。

半开状态可以很有效的阻止一个可以恢复的服务被大量的请求所淹没。而处于恢复中的服务,可能也能够承载一定数量的请求,直到完全恢复才能恢复全部的吞吐量。但是,突然大量的错误也可能会令恢复中的服务重新crash掉。
参考如下状态变换图:

这里写图片描述

需要注意的是,上图中,关闭状态所用的错误计数器是基于时间的。它会以一定的时间间隔来重置。这也能够在常见错误的情况下不让Circuit-Breaker模式进入打开状态。而错误计数阈值才会令Circuit-Breaker进入到打开状态,只有当指定时间间隔内,错误计数达到阈值才能令Circuit-Breaker进入到打开状态。半开状态所使用的成功计数器则会记录成功的调用次数。Circuit-Breaker如果在之后出现了连续的成功的调用,那么Circuit-Breaker就会进入关闭状态。如果任何调用的失败了,那么Circuit-Breaker也会重新进入到打开状态,成功计数器也会重置,直到下次重新进入到半开状态。

通常系统的外部恢复,很多时候都是通过重启失败的组件或者修复网络连接来完成的。

实现Circuit-Breaker模式可以增加系统的稳定性和弹性,当系统从错误恢复的时候,可以尽可能所有失败对系统性能的影响。Circuit-Breaker模式可以通过拒绝外

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值