首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

真该跟架构师来深度解析微服务高并发熔断降级:新版熔断降级!

新版熔断降级

Sentinel 1.8.0发布于2020年08月20日,从官方文档来看,该版本的最大亮点是对熔断降级功能进行了重构。旧版本的熔断降级功能对慢调用并不友好,而新版本改善了这个问题。

旧版熔断降级的不足

Sentinel 1.7.x支持以下3种熔断降级策略:

DEGRADE_GRADE_RT:按平均响应耗时。

DEGRADE_GRADE_EXCEPTION_RATIO:按失败比率。

DEGRADE_GRADE_EXCEPTION_COUNT:按失败次数。

1. 按平均响应耗时

当熔断降级策略为DEGRADE_GRADE_RT时,阈值为平均响应耗时,如果秒级滑动窗口统计的平均响应耗时超过熔断降级规则配置的阈值,则当连续rtSlowRequestAmount个请求之后,平均响应耗时依然超过阈值,则触发熔断。

将1秒内请求耗时的平均值与熔断降级规则配置的阈值进行比较,判断一个请求是否是慢请求。在接口耗时较长的情况下,如果1秒内统计的请求较为稀疏,会导致平均响应耗时容易受某个特别慢的请求影响,从而导致熔断效果不佳。

假设某接口调用的平均耗时正常为100毫秒,熔断的阈值为500毫秒,如果1秒内有10个请求,其中一个请求的耗时超过了10秒,就会将平均响应耗时延长到1090毫秒,则后续需要很多个平均耗时为100毫秒的请求才能将平均耗时降下来,这种情况下很容易触发熔断。

2. 按失败比率

当熔断降级策略为DEGRADE_GRADE_EXCEPTION_RATIO时,阈值为失败总数与成功总数的比值,如果秒级滑动窗口统计的失败总数与成功总数的比值大于或等于阈值,则触发熔断。

使用1秒内失败总数与成功总数的比值来判断是否达到熔断降级规则配置的阈值,这与按平均响应耗时一样,请求越稀疏,失败比率就越容易受单个异常请求的影响,从而提高失败比率,因此DEGRADE_GRADE_EXCEPTION_RATIO也不适用于慢调用场景。

3. 按失败次数

当熔断降级策略为DEGRADE_GRADE_EXCEPTION_COUNT时,阈值为失败次数,若分钟级滑动窗口统计的异常总数大于或等于阈值,则触发熔断。

使用1分钟内统计的失败请求总数作为阈值,即便将timeWindow配置为1秒,并在timeWindow秒之后关闭开关,开关也会立即被打开,因此大部分场景都不使用DEGRADE_GRADE_EXCEPTION_COUNT,这个缺点也使其成了一个无意义的选项。

新版本的改进

Sentinel 1.8.0使用的熔断降级策略(CircuitBreakerStrategy)如下:

SLOW_REQUEST_RATIO:按慢请求比率。

ERROR_RATIO:按失败比率。

ERROR_COUNT:按失败次数。

DegradeRule类调整后的源码如下:

其与旧版本的区别如下:

grade:熔断降级策略,取值为CircuitBreakerStrategy,并与旧版本取值兼容。

timeWindow:时间窗口大小,熔断器从打开状态到关闭状态的最小时间间隔。

slowRatioThreshold:慢请求比率,当熔断降级策略配置为SLOW_REQUEST_RATIO时使用。

statIntervalMs:统计时长,滑动窗口的周期,单位为毫秒。

1. 新版本支持的3种熔断降级策略均可自定义统计时长

DegradeRule类的statIntervalMs字段用于指定资源指标数据统计时长,单位为毫秒,默认值为1000。通过配置此字段来延长统计时长,可以将“稀疏”请求调整为“密集”请求。例如,若某接口的平均耗时为1秒,则可以将统计时长配置为10秒。

2. 对按平均响应耗时策略升级,改为按慢请求比率策略

由旧版本的按平均响应耗时策略改为按慢请求比率策略,统计慢请求数,使用慢请求数与总请求数的比值与阈值比较。

当熔断降级策略为SLOW_REQUEST_RATIO时,count表示慢请求阈值,只有响应耗时超出count的请求才会被记为慢请求,是否为慢请求取决于当前请求的响应耗时,与平均耗时没有关系;slowRatioThreshold则表示慢请求比率阈值,用于决定是否打开熔断器的阈值。

3. 引入半开启自动恢复支持,并提供熔断器事件监听器

从Sentinel 1.8.0开始,Sentinel使用熔断器实现熔断降级功能,每个熔断降级规则对应生成一个熔断器。新版引入的熔断器支持半开启自动恢复,并且可以注册自定义事件监听器以感知熔断器的状态变化。

熔断器有3种状态,分别是开启状态、半开启状态和关闭状态。当熔断器状态为半开启状态时,直接拒绝请求;当熔断器状态为关闭状态时,放行请求;当熔断器状态为开启状态时,根据timeWindow尝试将开启状态改为半开启状态,若修改成功,则放行当前请求,否则拒绝当前请求。

熔断器的实现原理

熔断器模式(或断路器模式)源于Martin Fowler的CircuitBreaker一文。在Hystrix早期就已经采用熔断器实现熔断降级,而Sentinel在Sentinel 1.8.0中才采用熔断器模式。

熔断器状态的切换类似于线程状态的切换,如图6.2所示:

图6.2 熔断器状态的切换

熔断器初始状态为关闭状态,当达到熔断降级规则配置的阈值时,熔断器的状态从关闭状态变为开启状态。

熔断器不能直接从开启状态变为关闭状态,只有处在半开启状态时才能关闭。当熔断器从关闭状态变为开启状态的时间与当前时间的间隔超过timeWindow时,可尝试将熔断器变为半开启状态。

熔断器可以从半开启状态变为关闭状态,也可以从半开启状态变为开启状态,但不能从关闭状态变为半开启状态。

触发熔断器从半开启状态变为开启状态的时机有如下两个:

达到熔断降级规则配置的阈值时开启熔断器,如慢请求比率达到阈值。

当前请求被其他地方拒绝时开启熔断器,如对同一资源配置多个熔断器时,有其他规则的熔断器拒绝了请求,或者被限流器限流。

对于处于半开启状态的熔断器,只要当前请求调用正常即可关闭:当熔断降级策略为按失败比率或按失败次数时,只要当前请求正常即可关闭熔断器;当熔断降级策略为按慢请求比率时,只要当前请求不是慢请求即可关闭熔断器。

在状态改变的过程中,熔断器在通知监听器的同时会修改一些数据,如图6.3所示:

图6.3 熔断器在状态改变时修改数据

当熔断器从关闭状态变为开启状态时,更新下一次允许将熔断器关闭的时间,即间隔timeWindow秒之后才可以将熔断器关闭。

当熔断器从半开启状态变为开启状态时,更新下一次允许熔断器关闭的时间。如果熔断器刚从开启状态变为半开启状态,此时想尝试关闭却发现又达到阈值了,就将其恢复为开启状态,并延长timeWindow秒之后再尝试关闭。

当熔断器从半开启状态变为关闭状态时,重置当前时间窗口统计的指标数据。每个熔断器都有一个独立的滑动窗口用于统计各自关心的指标数据。熔断器重置当前时间窗口的指标数据统计并非重置资源的指标数据统计。

重置熔断器统计的指标数据用于避免熔断器刚关闭又立即进入开启状态的现象出现。

本文给大家讲解的内容是深度解析微服务高并发熔断降级 :新版熔断降级

下篇文章给大家讲解的内容是深度解析微服务高并发熔断降级 :熔断器

感谢大家的支持!

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20230308A03QTF00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券