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,则结束熔断状态后仍可能再次进入熔断状态。