文章目录
- 引言
- 1.概念不同
- 1.1 熔断概念
- 1.2 降级概念
- 2.熔断器模型
- 3.种状态之间的转换关系
- 4.熔断策略
- 5.熔断和降级的关系
- 6.降级方式
- 6.1、熔断降级(不可用)
- 6.2、超时降级
- 6.3、限流降级
- 7.题外话
- 8.总结
引言
熔断和降级都是系统自我保护的一种机制,但二者又有所不同,它们的区别主要体现在以下几点:
- 概念不同
- 归属关系不同
1.概念不同
1.1 熔断概念
“熔断”一词早期来自股票市场。熔断(Circuit Breaker)也叫自动停盘机制,是指当股指波幅达到规定的熔断点时,交易所为控制风险采取的暂停交易措施。比如 2020 年 3 月 9 日,纽约股市开盘出现暴跌,随后跌幅达到 7% 上限,触发熔断机制,停止交易 15 分钟,恢复交易后跌幅有所减缓。
而熔断在程序中,表示“断开”的意思。如发生了某事件,程序为了整体的稳定性,所以暂时(断开)停止服务一段时间,以保证程序可用时再被使用。
熔断很好理解,就是一个断开的过程;
熔断就像是家里的保险丝一样,当电流达到一定条件时,比如保险丝能承受的电流是5A,如果你的电流达到了6A,因为保险丝承受不了这么高的电流,保险丝就会融化,这时候电路就会断开,起到了保护电器的作用;
在微服务里面也是一样,当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用;
如果没有熔断机制的话,会导致联机故障和服务雪崩等问题,如下图所示:
1.2 降级概念
降级(Degradation
)降低级别的意思,它是指程序在出现问题时,仍能保证有限功能可用的一种机制。
比如电商交易系统在双 11 时,使用的人比较多,此时如果开放所有功能,可能会导致系统不可用,所以此时可以开启降级功能,优先保证支付功能可用,而其他非核心功能,如评论、物流、商品介绍等功能可以暂时关闭。
所以,从上述信息可以看出:降级是一种退而求其次的选择,而熔断却是整体不可用。
2.熔断器模型
熔断器有三种状态:
Closed:也是初始状态,该状态下,熔断器会保持闭合,对资源的访问直接通过熔断器的检查
Open:断开状态,熔断器处于开启状态,对资源的访问会被切断
Half-Open:半开状态,该状态下除了探测流量,其余对资源的访问也会被切断。探测流量指熔断器处于半开状态时,会周期性的允许一定数目的探测请求通过,如果探测请求能够正常的返回,代表探测成功,此时熔断器会重置状态到 Closed 状态,结束熔断;如果探测失败,则回滚到 Open 状态。
3.种状态之间的转换关系
- 初始状态下,熔断器处于 Closed 状态。如果基于熔断器的统计数据表明当前资源触发了设定的阈值,那么熔断器会切换状态到 Open 状态;
- Open 状态即代表熔断状态,所有请求都会直接被拒绝。熔断器规则中会配置一个熔断超时重试的时间,经过熔断超时重试时长后熔断器会将状态置为 Half-Open 状态,从而进行探测机制;
- 处于 Half-Open 状态的熔断器会周期性去做探测。
4.熔断策略
- 慢调用比例策略 (SlowRequestRatio): 在非静默期内,当响应慢的请求(需要设置RT响应临界值)达到一定的比例并且触发了阈值(需要设置)的条件,就会熔断
- 错误比例策略 (ErrorRatio):在非静默期内,并且在统计周期内资源请求访问异常的比例大于设定的阈值,则接下来的熔断周期内对资源的访问会自动地被熔断。
- 错误计数策略 (ErrorCount):在非静默期内,并且在统计周期内资源请求访问异常数大于设定的阈值,则接下来的熔断周期内对资源的访问会自动地被熔断。
5.熔断和降级的关系
说了那么多,其实也能想到了,降级和熔断其实就是服务安全中的2个不同的流程,在服务发生故障时,肯定是先断开(熔断)与服务的连接,然后在执行降级逻辑;
那既然不管怎样都会执行降级逻辑,这时候就可以理解为 降级是一种设计思想,在java层面就是一个接口,而熔断是降级的不同实现方式,他们的关系如下图:
6.降级方式
那么我们现在知道降级是一个接口了,接下来在看看他们的实现方式是怎样的吧
6.1、熔断降级(不可用)
熔断逻辑是这样的,A服务调用B服务,失败次数达到一定阈值后 ,A服务的断路器打开,就不在请求B服务,而是直接执行本地的fallback方法;这种叫做熔断降级,看到这里,也许你已经明白了,熔断只是降级的其中一种实现方式;
6.2、超时降级
熔断逻辑是这样的,A服务调用B服务,失败次数达到一定阈值后 ,A服务的断路器打开,就不在请求B服务,而是直接执行本地的fallback方法;这种叫做熔断降级,看到这里,也许你已经明白了,熔断只是降级的其中一种实现方式;
同样是A服务调用B服务,B服务响应超过了A服务设定的阈值后,就会执行降级逻辑;
6.3、限流降级
同样是A服务调用B服务,服务A的连接已超过自身能承载的最大连接数,比如说A能承载的连接数为5,但是目前的并发有6个请求同时进行,前5请求能正常请求,最后一个会直接拒绝,执行fallback降级逻辑;
7.题外话
当然,某些框架如 Sentinel,它早期在 Dashboard 控制台中可能叫“降级”,但在新版中新版本又叫“熔断”,如下图所示:
但在两个版本中都是通过同一个异常类型 DegradeException 来监听的,如下代码所示:
所以,在 Sentinel 中,熔断和降级功能指的都是同一件事,也侧面证明了“熔断”和“降级”概念的相似性。但我们要知道它们本质上是不同的,就像两个双胞胎,不能因为他们长得像,就说他们是同一个人。
8.总结
熔断和降级都是程序在我保护的一种机制,但二者在概念、触发条件、归属关系上都是不同的。熔断更偏向于全局视角的自我保护(机制),而降级则偏向于具体模块“退而请其次”的解决方案。