Version: Next

Sentinel 服务降级

熔断降级文档

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 熔断降级会在调用链路中某个资源出现不稳定状态时,对该资源的调用进行限制,让请求快速失败,避免影响其他资源引发级联错误
  • 资源被降级后,在接下来的降级时间窗口内,对该资源的调用都会 自动熔断,默认行为为抛出 DegradeExceptopn
注意
  • Sentinel 断路器没有 半开状态
  • Sentinel 1.8 开始,添加了 恢复状态,即 Half-Open 半开状态

慢调用比例(平均响应时间-秒级)

  • 当资源的响应时间超过最大 RT(以ms为单位,最大 RT 即最大响应时间)之后,资源进入 准降级状态
  • 如果接下来 1s 内持续进入 5 个请求(最小请求数),它们的RT都持续超过这个阈值,那么在接下来的 熔断时长 之内,就会对这个方法进行服务降级
  • 其中的“比例阈值”设置发现无效,下次编辑会重置成 1
  • RT 最大为 4900 ,更大的值需要通过 -Dcsp.sentinel.statistic.max.rt=XXXX 进行设置


  • 在 Controller 添加 /testD 业务接口
FlowLimitController
@GetMapping("/testD")
public String testD() {
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}
log.info("testD 测试 RT");
return "----testD";
}

使用 JMeter 并发测试

  • 设置循环每 1 秒使用 10 个线程访问


  • Http 访问设置


  • 开始执行后,发现 /testD 被熔断了
    • 之后 10 秒后,它尝试进行恢复
    • 若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断

异常比例(秒级)

  • QPS >= 最小请求数 异常比例 超过阈值时,触发降级
  • 时间窗口结束后,关闭降级
  • 此处设置为 QPS 大于等于 5,且 异常超过四分之一,触发熔断
  • 熔断时间到达后:若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断


  • 还需要写一个能够触发异常的业务
FlowLimitController
int i = 0;
@GetMapping("/testD")
public String message1() {
i++;
// 异常比例为0.333
if (i % 3 == 0) {
throw new RuntimeException("模拟异常");
}
return "message1";
}
提示
  • 在触发熔断降级之前:访问 /testD 出发了异常,会看到 500 报错,说明请求正常响应了,只是服务器执行异常
  • 如果错的够多,那么会触发降级,响应的是降级报错字符串

异常数(分钟级)

  • QPS >= 最小请求数 每分钟异常数超过阈值时,触发降级
  • 当资源近 1 分钟的异常数目超过阈值(异常数)之后会进行服务降级。
注意

注意由于统计时间窗口是分钟级别的,若熔断时长小于 60s,则结束熔断状态后仍可能再次进入熔断状态。