微服务面试题:熔断和降级有什么区别?

Posted IT-熊猫

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了微服务面试题:熔断和降级有什么区别?相关的知识,希望对你有一定的参考价值。

文章目录

引言

熔断和降级都是系统自我保护的一种机制,但二者又有所不同,它们的区别主要体现在以下几点:

  • 概念不同
  • 归属关系不同

1.概念不同

1.1 熔断概念

“熔断”一词早期来自股票市场。熔断(Circuit Breaker)也叫自动停盘机制,是指当股指波幅达到规定的熔断点时,交易所为控制风险采取的暂停交易措施。比如 2020 年 3 月 9 日,纽约股市开盘出现暴跌,随后跌幅达到 7% 上限,触发熔断机制,停止交易 15 分钟,恢复交易后跌幅有所减缓。

而熔断在程序中,表示“断开”的意思。如发生了某事件,程序为了整体的稳定性,所以暂时(断开)停止服务一段时间,以保证程序可用时再被使用。

熔断很好理解,就是一个断开的过程;

熔断就像是家里的保险丝一样,当电流达到一定条件时,比如保险丝能承受的电流是5A,如果你的电流达到了6A,因为保险丝承受不了这么高的电流,保险丝就会融化,这时候电路就会断开,起到了保护电器的作用;

在微服务里面也是一样,当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用;

如果没有熔断机制的话,会导致联机故障和服务雪崩等问题,如下图所示:

1.2 降级概念

降级(Degradation)降低级别的意思,它是指程序在出现问题时,仍能保证有限功能可用的一种机制。

比如电商交易系统在双 11 时,使用的人比较多,此时如果开放所有功能,可能会导致系统不可用,所以此时可以开启降级功能,优先保证支付功能可用,而其他非核心功能,如评论、物流、商品介绍等功能可以暂时关闭。

所以,从上述信息可以看出:降级是一种退而求其次的选择,而熔断却是整体不可用。

2.熔断器模型


熔断器有三种状态:

Closed:也是初始状态,该状态下,熔断器会保持闭合,对资源的访问直接通过熔断器的检查
Open:断开状态,熔断器处于开启状态,对资源的访问会被切断
Half-Open:半开状态,该状态下除了探测流量,其余对资源的访问也会被切断。探测流量指熔断器处于半开状态时,会周期性的允许一定数目的探测请求通过,如果探测请求能够正常的返回,代表探测成功,此时熔断器会重置状态到 Closed 状态,结束熔断;如果探测失败,则回滚到 Open 状态。

3.种状态之间的转换关系

  1. 初始状态下,熔断器处于 Closed 状态。如果基于熔断器的统计数据表明当前资源触发了设定的阈值,那么熔断器会切换状态到 Open 状态;
  2. Open 状态即代表熔断状态,所有请求都会直接被拒绝。熔断器规则中会配置一个熔断超时重试的时间,经过熔断超时重试时长后熔断器会将状态置为 Half-Open 状态,从而进行探测机制;
  3. 处于 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.总结

熔断和降级都是程序在我保护的一种机制,但二者在概念、触发条件、归属关系上都是不同的。熔断更偏向于全局视角的自我保护(机制),而降级则偏向于具体模块“退而请其次”的解决方案。

以上是关于微服务面试题:熔断和降级有什么区别?的主要内容,如果未能解决你的问题,请参考以下文章

熔断降级

通过API网关实现微服务管控-限流,熔断和降级

微服务熔断配置

服务熔断, 服务降级

服务熔断, 服务降级

聊聊微服务熔断降级Hystrix