面试官:熔断和降级有什么区别?

开发 前端
在 Sentinel 中,熔断和降级功能指的都是同一件事,也侧面证明了“熔断”和“降级”概念的相似性。但我们要知道它们本质上是不同的,就像两个双胞胎,不能因为他们长得像,就说他们是同一个人。

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

  1. 概念不同
  2. 触发条件不同
  3. 归属关系不同

1.概念不同

1.1 熔断概念

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

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

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

图片

1.2 降级概念

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

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

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

2.触发条件不同

不同框架的熔断和降级的触发条件是不同的,本文咱们以经典的 Spring Cloud 组件 Hystrix 为例,来说明触发条件的问题。

2.1 Hystrix 熔断触发条件

默认情况 hystrix 如果检测到 10 秒内请求的失败率超过 50%,就触发熔断机制。之后每隔 5 秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求。

图片

2.2 Hystrix 降级触发条件

默认情况下,hystrix 在以下 4 种条件下都会触发降级机制:

  1. 方法抛出 HystrixBadRequestException
  2. 方法调用超时
  3. 熔断器开启拦截调用
  4. 线程池或队列或信号量已满

虽然 hystrix 组件的触发机制,不能代表所有的熔断和降级机制,但足矣说明此问题。

3.归属关系不同

熔断时可能会调用降级机制,而降级时通常不会调用熔断机制。因为熔断是从全局出发,为了保证系统稳定性而停用服务,而降级是退而求其次,提供一种保底的解决方案,所以它们的归属关系是不同(熔断 > 降级)。

题外话

当然,某些框架如 Sentinel,它早期在 Dashboard 控制台中可能叫“降级”,但在新版中新版本又叫“熔断”,如下图所示:

图片

但在两个版本中都是通过同一个异常类型 DegradeException 来监听的,如下代码所示:

图片

所以,在 Sentinel 中,熔断和降级功能指的都是同一件事,也侧面证明了“熔断”和“降级”概念的相似性。但我们要知道它们本质上是不同的,就像两个双胞胎,不能因为他们长得像,就说他们是同一个人。

总结

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

参考 & 鸣谢

​https://blog.csdn.net/BiandanLoveyou/article/details/118067224​

​https://cloud.tencent.com/developer/article/1600700​

作者介绍

磊哥,14 年编程和框架从业经验,前 360 技术专家、CSDN 签约作者、阿里云专家博主、拉勾网签约作者、掘金优秀作者、慕课网讲师等。期待与你相遇,一起探讨和分享技术的乐趣。

责任编辑:武晓燕 来源: Java中文社群
相关推荐

2024-04-03 15:33:04

JWTSession传输信息

2021-12-10 12:01:37

finalfinallyfinalize

2021-11-30 07:44:50

FinalFinallyFinalize

2021-12-13 06:56:45

Comparable元素排序

2024-03-20 15:12:59

KafkaES中间件

2021-12-23 07:11:31

开发

2023-02-09 07:01:35

转发重定向Java

2023-07-11 08:40:02

IO模型后台

2023-02-20 07:19:14

2023-12-13 13:31:00

useEffect对象浏览器

2022-05-16 11:04:43

RocketMQPUSH 模式PULL 模式

2024-03-26 16:24:46

分布式事务2PC3PC

2021-12-27 06:57:40

This SuperJava

2023-12-05 09:33:08

分布式事务

2021-05-10 08:01:12

BeanFactoryFactoryBean容器

2022-08-22 07:06:32

MyBatisSQL占位符

2021-07-08 06:51:29

React函数组件

2022-08-15 07:06:50

Propertiesyml配置

2022-02-08 07:02:32

进程线程操作系统

2022-08-03 07:04:56

GETHTTPPOST
点赞
收藏

51CTO技术栈公众号