熔断降级

熔断降级

故障熔断,指的是当下游因过载或者BUG等原因,出现请求错误后,为了防止故障级联扩散导致整个链路出现异常,从而对请求进行拒绝或者重试的一种机制。

熔断模型

熔断模型的设计遵循业界标准的熔断器模型设计。熔断器有3类状态:

  • 关闭:所有请求皆可访问下游资源,无任何限制。
  • 打开:限制访问下游资源的请求,不允许任何请求的访问。
  • 半开:限制访问下游资源的请求,只允许部分请求达到下游。

熔断场景

熔断一般会发生在以下场景下:

硬件环境出现故障

服务在运营过程中,因为一些不可抗力的因素,可能会出现机器故障、机器重启、机房断电、网络中断等问题。通过熔断机制,对服务实例或者机房分组的快速熔断,可以避免业务请求持续失败。

版本上线引入BUG

版本新特性开发上线后,因为漏测等原因,某些分支触发了BUG,导致部分的业务逻辑出现故障。常见的是部分方法在遇到某些入参的时候,会出现进程报错或者高负载的问题,影响其他方法的请求处理。通过熔断机制,将故障方法进行屏蔽,可以避免其他业务请求受到影响。

服务出现过载

因为路由不均或者峰值流量的到来,导致被调服务出现了高负载,导致请求的时延增大,成功率降低。通过熔断机制,合理的拒绝一部分请求,可以降低服务负载,恢复正常的运行状态。

熔断级别

接口级熔断

应用与服务之间的调用都是针对接口进行调用,为避免调用故障接口导致业务整体时延较大,加剧后端的压力。用户可以设置熔断规则,按照整个服务或者服务下某个接口的粒度设置熔断阈值,并统计在调用过程中的错误率时延等数据,达到阈值后会进行熔断(熔断器打开)。熔断后,访问该服务或特定接口的请求都会返回失败或者走降级逻辑。

接口级熔断生效在接口调用前,主调服务访问接口前需要判断接口的熔断状态。

实例级熔断

一般用于远程服务调用(RPC)的场景,针对某个节点或者分组(具备相同标签的节点集)设置熔断阈值,实例级熔断往往按照具体的服务实例进行熔断统计,并统计在调用过程中的错误率时延等数据,达到阈值后会进行熔断。熔断后,该实例会被屏蔽,不会有请求路由进来,直到恢复。

接口级熔断生效在接口调用中,在负载均衡过程中完成对熔断状态实例的剔除。

触发熔断条件

连续错误数熔断

请求调用时,统计周期内,出现连续错误数目超过阈值之后,资源进入熔断状态。

错误率熔断

熔断器按照滑窗对请求总数及成功数进行统计,并汇总时间段内的总错误率,一旦超过阈值,资源进入熔断状态。

错误判断条件

系统需要通过错误请求的统计来判断是否需要触发熔断,请求的错误一般会表现出以下2个方面的特性:

返回的状态码

对于标准协议的请求,比如HTTP Response,常见的5XX等状态码,代表着后端出现异常(比如数据库异常)导致业务请求失败。

时延

对于交易系统等对时延比较敏感的系统,当出现后端数据库等负载过高的情况,导致部分请求可以正常处理,但是时延普遍过高,此时仍可认为这部分请求是失败请求,触发熔断处理。

熔断恢复

当资源的错误请求统计达到一定阈值后,资源会进入熔断状态,在接下来的一段时间内,该资源将会被屏蔽(不会有请求路由到该资源),渡过屏蔽期后,资源会进入半开状态,此时系统会放少部分业务请求给该资源,并记录请求的处理结果。假如请求全部处理成功,则资源恢复成功(熔断器关闭),取消屏蔽并正常处理业务请求。

但是,假如业务请求扔存在处理失败,则该资源会重新进入熔断状态,继续保持隔离。

如何使用