Spring中的Sentinel熔断降级原理详解
作者:Heloise_yangyuchang
一、概述
对于熔断这个概念,我们并不陌生,比如股市熔断机制,当股指波幅达到规定的熔断点时,交易所为控制风险采取的暂停交易措施。亦或者是电流熔断,当通过的电流超出导线所能成再的最大电流时,会触发保险丝熔断,从而避免因为电流过大造成火灾。
在这些场景中,可以发现一个共同的特点,就是熔断在这些场景中都是充当保护机制,避免引发更大的问题。那么在整个微服务架构中,也同样会存在类似的问题。
二、服务熔断
在微服务架构中,一个请求过来,可能会经过多个服务进行处理,导致整个处理链路会比较长。而在整条调用链路中,可能会因为某个节点因为网络故障导致响应时间比较长,而这个节点的阻塞将会影响这条链路的结果返回。 当访问量比较高的请求下,一个后端依赖节点的延迟响应可能导致所有服务器上的所有资源在数秒内饱和。一旦出现这个问题,会导致系统资源被快速消耗,从而导致服务宕机等问题,最坏的情况会导致服务雪崩。
为了防止这种问题的产生,也引入了熔断的概念。
所以,熔断的意义:是为了起到保护作用,如果某个目标服务调用比较慢或者大量的超时,这个时候如果触发熔断机制,则可以保证后续的请求不会继续发送到目标服务上,而是直接返回降级的逻辑并且快速释放资源。如果目标服务的情况恢复了,那么熔断机制又会动态进行关闭。
三、Sentinel中熔断
Sentinel 熔断降级会在调用链路中某个资源出现不稳定状态时(例如调用超时或异常比例升高),对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联错误。当资源被降级后,在接下来的降级时间窗口之内,对该资源的调用都自动熔断。
在Sentinel中判断资源是否处于稳定状态的指标或者纬度:
- 慢调用比例(SLOW_REQUEST_RATIO)
- 异常比例(ERROR_RATIO)
- 异常数(ERROR_COUNT)
Sentinel中提供了DegradeRule对象来实现规则设置,核心属性如下:
- resource,资源名称
- count, 阈值,[异常比例/异常数模式下为对应的阈值,慢调用比例模式下为慢调用临 界 RT]
- grade,熔断模式,根据RT降级、根据异常比例、根据异常数量
- timeWindow,熔断时间,单位为秒
3.1、慢调用比例(SLOW_REQUEST_RATIO)
在一定请求次数中,一段时间内,如果有一定比例的请求响应时间大于某一个阈值,则认为目标服务异常,则在接下来的指定时间内,请求都会被自动熔断。当经过熔断时长后,熔断器会进入到探测恢复状态,若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
参数设置(1s内连续发送10个请求,在1分钟以内,其中20%的请求平均响应时间都超过3s,则触发熔断,熔断时间为5s)
DegradeRule rule = new DegradeRule(RESOURCE_KEY) .setGrade(CircuitBreakerStrategy.SLOW_REQUEST_RATIO.getType()) // Max allowed response time .setCount(3000) // Retry timeout (in second) .setTimeWindow(5) // Circuit breaker opens when slow request ratio > 20% .setSlowRatioThreshold(0.2) .setMinRequestAmount(10) .setStatIntervalMs(60000);
- grade=CircuitBreakerStrategy.SLOW_REQUEST_RATIO, (熔断模式)
- count=3000,最大的响应时间,单位为(毫秒)
- TimeWindow=5 (单位为s)
- minRequestAmount=5,最小请求数量,请求数量小于这个值,即时异常比例超出阈值也不会熔断,默认是5次。
- slowRatioThreshold=0.2,慢调用比例阈值,仅仅在慢调用比例模式下有效。
- statIntervalMs=1000*60, 统计时长为60秒,默认为1秒
3.2、异常比例 (ERROR_RATIO)
当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值时,则触发熔断,配置方式如下
- grade=CircuitBreakerStrategy.ERROR_RATIO
- count(异常比例),范围[0.0 , 1.0],代表0%~100%
- TimeWindow=5 (单位为s)
- minRequestAmount,最小请求数量,请求数量小于这个值,即时异常比例超出阈值也不会熔断,默认是5次。
3.3、异常数量(ERROR_COUNT)
当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
- grade=CircuitBreakerStrategy.ERROR_COUNT
- count(异常数量)
- timeWindow=5 (熔断时间窗口,单位为s)
- statIntervalMs=60*1000(统计时长,单位为ms)
当资源近1 分钟的异常数目超过阈值之后会进行熔断。注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。
四、总结
限流、熔断和服务降级是系统容错的重要设计模式,从一定意义上讲限流和熔断也是一种服务降级的手段。
熔断和服务降级主要是针对非核心业务功能,而核心业务如果流程超过预估的峰值,就需要进行限流。
对于限流,选择合理的限流算法很重要,令牌桶算法优势很明显,也是使用最多的限流算法。
在系统设计的时候,这些模式需要配合业务量的预估、性能测试的数据进行相应阈值的配置,而这些阈值最好保存在配置中心,方便实时修改。
到此这篇关于Spring中的Sentinel熔断降级原理详解的文章就介绍到这了,更多相关Sentinel熔断降级原理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!