熔断降级
熔断降级
故障熔断,指的是当下游因过载或者BUG等原因,出现请求错误后,为了防止故障级联扩散导致整个链路出现异常,从而对请求进行拒绝或者重试的一种机制。
熔断模型
熔断模型的设计遵循业界标准的熔断器模型设计。熔断器有3类状态:
- 关闭:所有请求皆可访问下游资源,无任何限制。
- 打开:限制访问下游资源的请求,不允许任何请求的访问。
- 半开:限制访问下游资源的请求,只允许部分请求达到下游。
熔断场景
熔断一般会发生在以下场景下:
硬件环境出现故障
服务在运营过程中,因为一些不可抗力的因素,可能会出现机器故障、机器重启、机房断电、网络中断等问题。通过熔断机制,对服务实例或者机房分组的快速熔断,可以避免业务请求持续失败。
版本上线引入BUG
版本新特性开发上线后,因为漏测等原因,某些分支触发了BUG,导致部分的业务逻辑出现故障。常见的是部分方法在遇到某些入参的时候,会出现进程报错或者高负载的问题,影响其他方法的请求处理。通过熔断机制,将故障方法进行屏蔽,可以避免其他业务请求受到影响。
服务出现过载
因为路由不均或者峰值流量的到来,导致被调服务出现了高负载,导致请求的时延增大,成功率降低。通过熔断机制,合理的拒绝一部分请求,可以降低服务负载,恢复正常的运行状态。
熔断级别
接口级熔断
应用与服务之间的调用都是针对接口进行调用,为避免调用故障接口导致业务整体时延较大,加剧后端的压力。用户可以设置熔断规则,按照整个服务或者服务下某个接口的粒度设置熔断阈值,并统计在调用过程中的错误率时延等数据,达到阈值后会进行熔断(熔断器打开)。熔断后,访问该服务或特定接口的请求都会返回失败或者走降级逻辑。
接口级熔断生效在接口调用前,主调服务访问接口前需要判断接口的熔断状态。
实例级熔断
一般用于远程服务调用(RPC)的场景,针对某个节点或者分组(具备相同标签的节点集)设置熔断阈值,实例级熔断往往按照具体的服务实例进行熔断统计,并统计在调用过程中的错误率时延等数据,达到阈值后会进行熔断。熔断后,该实例会被屏蔽,不会有请求路由进来,直到恢复。
接口级熔断生效在接口调用中,在负载均衡过程中完成对熔断状态实例的剔除。
触发熔断条件
连续错误数熔断
请求调用时,统计周期内,出现连续错误数目超过阈值之后,资源进入熔断状态。
错误率熔断
熔断器按照滑窗对请求总数及成功数进行统计,并汇总时间段内的总错误率,一旦超过阈值,资源进入熔断状态。
错误判断条件
系统需要通过错误请求的统计来判断是否需要触发熔断,请求的错误一般会表现出以下2个方面的特性:
返回的状态码
对于标准协议的请求,比如HTTP Response,常见的5XX等状态码,代表着后端出现异常(比如数据库异常)导致业务请求失败。
时延
对于交易系统等对时延比较敏感的系统,当出现后端数据库等负载过高的情况,导致部分请求可以正常处理,但是时延普遍过高,此时仍可认为这部分请求是失败请求,触发熔断处理。
熔断恢复
当资源的错误请求统计达到一定阈值后,资源会进入熔断状态,在接下来的一段时间内,该资源将会被屏蔽(不会有请求路由到该资源),渡过屏蔽期后,资源会进入半开状态,此时系统会放少部分业务请求给该资源,并记录请求的处理结果。假如请求全部处理成功,则资源恢复成功(熔断器关闭),取消屏蔽并正常处理业务请求。
但是,假如业务请求扔存在处理失败,则该资源会重新进入熔断状态,继续保持隔离。