在上面两篇文章中,我们研究完了 Sentinel 的流控规则,从这篇开始,我们继续去学习 Sentinel 的熔断降级规则。

话不多说,开始今天的学习。

一、概述

除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。

现代微服务架构都是分布式的,由非常多的服务组成。不同服务之间相互调用,组成复杂的调用链路。以上的问题在链路调用中会产生放大的效果。复杂链路上的某一环不稳定,就可能会层层级联,最终导致整个链路都不可用。因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。

本文是针对 Sentinel 1.8.0 及以上版本,1.8.0 版本对熔断降级特性进行了全新的改进升级

二、熔断策略

Sentinel 提供以下几种熔断策略:

  • 慢调用比例 (SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
  • 异常比例 (ERROR_RATIO):当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
  • 异常数 (ERROR_COUNT):当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

注意异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效。

三、控制台定义

点击熔断

image-20220130210806536

新增熔断规则

image-20220130210829157

四、代码定义

private void initDegradeRule() {
    List<DegradeRule> rules = new ArrayList<>();
    DegradeRule rule = new DegradeRule();
    rule.setResource(KEY);
    // set threshold RT, 10 ms
    rule.setCount(10);
    rule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
    rule.setTimeWindow(10);
    rules.add(rule);
    DegradeRuleManager.loadRules(rules);
}

五、属性说明

熔断降级规则(DegradeRule)包含下面几个重要的属性:

Field 说明 默认值
resource 资源名,即规则的作用对象
grade 熔断策略,支持慢调用比例/异常比例/异常数策略 慢调用比例
count 慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
timeWindow 熔断时长,单位为 s
minRequestAmount 熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入) 5
statIntervalMs 统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入) 1000 ms
slowRatioThreshold 慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

Sentinel 的断路器是没有半开状态的

六、实际测试

上面这些概念性的东西官网中基本都有,我们还是需要来实际使用配置下,才能更好的去理解 Sentinel 的熔断降级规则。

1. 慢调用比例

1.1、慢调用比例测试接口 /testD

@GetMapping("/testD")
public String testD(){
    try {
        // 睡眠两秒
        TimeUnit.SECONDS.sleep(2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    log.info("testD 测试慢调用比例");
    return "testD....";
}

1.2、控制台定义

image-20220130221115976

此配置的效果为:

在 2 秒的统计时间(统计时长)内,对 /testD 的请求数大于 5 (最小请求数),请求响应时间(最大 RT)大于 1 秒的请求占比超过比例阈值 0.1 ,则下一个请求开始触发熔断,熔断时长是 10 秒,也就是 10 秒内,熔断器是打开状态,这期间的请求都会触发熔断,10秒过后熔断器关闭,此时熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

也可以这样说:

在 2 秒内发送了 10 个请求(大于最小请求数 5 ),只要有 1 个请求的响应时间超过了最大 RT 1 秒,则下一个请求开始触发熔断

注意,这些条件要同时满足。

1.3、Jmeter 配置

设置一个线程组,一秒钟 10 次请求,循环一次

image-20220130223502634

HTTP 请求就不贴了,就是请求 /testD

启动,观察结果树:

image-20220130224016889

这 1 秒的 10 个请求都是正常的,此时我们紧接着浏览器再访问一下 /testD 资源,发现触发熔断

image-20220130224143803

然后在熔断时长 10 秒过后,再次访问 /testD 恢复正常(但此时熔断器处于探测恢复状态)

image-20220130224248182

注意:此时熔断器处于探测恢复状态(HALF-OPEN 状态),下次请求依旧会直接熔断,如果想测试的时候想取消这种状态要重启一下项目,或者改一下熔断规则

2. 异常比例

明白了 慢调用比例 这个规则之后,我们再来学 异常比例异常数 这两个规则就会觉得非常简单了。大部分参数都是相同的

1.1、慢调用比例测试接口 /testE

@GetMapping("/testE")
public String testE(){
    int a = 10/0;
    log.info("testD 测试异常比例");
    return "testE....";
}

这个接口调用时肯定会出异常的

image-20220130230334075

1.2、控制台定义

image-20220130230405772

只是比慢调用比例规则配置少了一个最大 RT

此配置效果:

在 1 秒的统计时间(统计时长)内,对 /testE 的请求数大于 5 (最小请求数),并且请求异常比例超过 0.1 ,则下一个请求开始触发熔断,熔断时长是 10 秒,也就是 10 秒内,熔断器是打开状态,这期间的请求都会触发熔断,10秒过后熔断器关闭,此时熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。

1.3、Jmeter 配置

image-20220130230921064

都还和上面一样,只不过把 HTTP 请求接口改为了 /testE

启动,观察结果树:

image-20220130231023197

image-20220130231043187

发现从第 6 次请求开始直接触发了熔断

接下来浏览器的访问效果和慢调用比例一模一样,就不说了。

3. 异常数

异常数那就更简单了

接口我们还是使用上面的 /testE

  • 控制台定义

image-20220130231452480

此配置效果也不用讲了,相信大家自己就能推出来了。

Jmeter 配置也和上面一样

启动,观察结果树

image-20220130231023197

image-20220130231043187

发现同样是从第 6 次请求开始直接触发了熔断

好,至此,本文结束。

PS:都看到这里了,点个赞吧,彦祖

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐