熔断和降级都是系统自我保护的一种机制,但二者又有所不同,它们的区别主要体现在以下几点:
-
概念不同
-
触发条件不同
-
归属关系不同
1.概念不同
1.1熔断概念
“熔断”一词早期来自股票市场。熔断(Circuit Breaker)也叫自动停盘机制,是指当股指波幅达到规定的熔断点时,交易所为控制风险采取的暂停交易措施。而熔断在程序中,表示“断开”的意思。如发生了某事件,程序为了整体的稳定性,所以暂时(断开)停止服务一段时间,以保证程序可用时再被使用。如果没有熔断机制的话,会导致联机故障和服务雪崩等问题,如下图所示:
1.2降级概念
降级(Degradation)降低级别的意思,它是指程序在出现问题时,仍能保证有限功能可用的一种机制。
比如电商交易系统在双 11 时,使用的人比较多,此时如果开放所有功能,可能会导致系统不可用,所以此时可以开启降级功能,优先保证支付功能可用,而其他非核心功能,如评论、物流、商品介绍等功能可以暂时关闭。所以,从上述信息可以看出:降级是一种退而求其次的选择,而熔断却是整体不可用。
2.触发条件不同
不同框架的熔断和降级的触发条件是不同的,本文咱们以经典的 Spring Cloud 组件 Hystrix 为例,来说明触发条件的问题。
2.1Hystrix 熔断触发条件
默认情况 hystrix 如果检测到 10 秒内请求的失败率超过 50%,就触发熔断机制。之后每隔 5 秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求。
2.2 Hystrix 降级触发条件
默认情况下,hystrix 在以下 4 种条件下都会触发降级机制:
- 方法抛出 HystrixBadRequestException
- 方法调用超时
- 熔断器开启拦截调用
- 线程池或队列或信号量已满
虽然 hystrix 组件的触发机制,不能代表所有的熔断和降级机制,但足矣说明此问题。
3.归属关系不同
熔断时可能会调用降级机制,而降级时通常不会调用熔断机制。因为熔断是从全局出发,为了保证系统稳定性而停用服务,而降级是退而求其次,提供一种保底的解决方案,所以它们的归属关系是不同(熔断 > 降级)。
在 Sentinel 中,熔断和降级功能指的都是同一件事,也侧面证明了“熔断”和“降级”概念的相似性。但我们要知道它们本质上是不同的,就像两个双胞胎,不能因为他们长得像,就说他们是同一个人。
4.总结
熔断和降级都是在面对高并发或系统故障等异常情况下,为了保护系统稳定性而采取的容错措施。虽然它们的目的都是为了保护系统,但是它们的实现方式和作用是不同的,下面是它们的区别:
-
触发条件不同:熔断是根据故障的发生率来触发,一般是在服务出现错误的情况下触发,当错误的比例超过一定阈值时,会自动切换到熔断状态,从而避免对服务的继续请求;而降级是根据系统的负载情况来触发,当系统达到某个负载水平时,会自动触发降级,以减轻系统压力。
-
目的不同:熔断的目的是为了避免连锁反应,即某个服务的故障会导致其他服务的负载过高而崩溃,因此熔断可以在故障发生时,及时切断与该服务的请求,从而避免对其他服务的影响;而降级的目的是为了优化系统性能,即在系统压力过高时,通过暂时关闭一些不必要的服务,以减轻系统负载。
-
状态变化不同:熔断状态是一个二状态的机制,即打开或关闭,当发生故障时,会进入熔断状态,等待一定时间后再尝试恢复;而降级状态是一个多状态的机制,即可以有多个降级级别,当系统压力过大时,可以根据负载情况切换到不同的降级级别,以适应不同的负载情况。
综上所述,熔断和降级虽然都是为了保护系统稳定性而采取的容错措施,但是它们的触发条件、目的和状态变化都是不同的,因此在设计容错机制时,应该根据业务场景和系统特点来选择合适的方案。