降级规则
除了流量控制以外,对调用链路中不稳定的资源进行熔断降级也是保障高可用的重要措施之一。一个服务常常会调用别的模块,可能是另外的一个远程服务、数据库,或者第三方 API 等。例如,支付的时候,可能需要远程调用银联提供的 API;查询某个商品的价格,可能需要进行数据库查询。然而,这个被依赖服务的稳定性是不能保证的。如果依赖的服务出现了不稳定的情况,请求的响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用。
熔断降级规则说明熔断降级规则(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 引入) |
慢调用比例
慢调用比例 (SLOW_REQUEST_RATIO
):选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
设置慢调用比例:在1000ms内,至少调用接口3次,如果有比例达到0.5的接口响应时间达到慢调用标准(100ms),则该接口熔断,熔断时长为5秒。
测试代码
-
如果每秒钟请求少于3次,则一直都不会熔断
-
如果有一次一秒钟内请求达到3次,则熔断开始,5秒后成功一次(半熔断),继续熔断。(熔断结束后,下一次请求达到阈值,所以继续熔断)
-
如果下一次请求,没有达到阈值,则结束熔断
@RestController
@Slf4j
public class FlowControllerEffectController {
@GetMapping("/warmup")
public String threads(){
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "测试流控效果===热启动warmup";
}
}
异常比例
当单位统计时长(statIntervalMs
)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0]
,代表 0% - 100%。
设置慢调用比例:这个设置和慢调用设置类型,在1000ms内接口请求达到3次,达到比例0.5的请求出现异常,进入熔断
此时接口熔断10秒,10秒后进入半熔断状态。如果再次请求正常则恢复正常,否则继续熔断10秒。
测试代码
-
1秒内请求3次以下异常,不会熔断
-
1秒内请求3次或以上,都出现异常,进入熔断
-
10秒内请求,为熔断状态
-
10秒后请求异常,再次熔断(请求两次,第一次异常,第二次熔断)
-
10秒后请求非异常,熔断结束(多次请求,没有异常或者熔断)
@GetMapping("/test1")
public String threads2(Integer flag){
if(flag!=null && flag>1){
throw new RuntimeException("异常比例测试");
}
return "异常比例test1";
}
异常数
当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
注意:异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException
)不生效。
异常数设置:检测时间1000ms内,至少请求3次,至少有2次异常,此时进入熔断状态,熔断市场10秒,10秒后进入半熔断状态,再次请求如果成功则结束熔断,如果异常则再次进入熔断状态。