熔断策略
Sentinel有三种熔断策略:慢调用比例、异常比例、异常数。
-
慢调用比例:选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
测试示例:
该配置在满足一下两个条件时会发生熔断降级:1. 2000ms内至少有5个请求。2. 2000ms内最大响应时间大于100ms的请求大于50%。
下面代码的最大响应时间一定会大于100ms,所以当2000ms内超过5个请求时会发生熔断降级。
@SneakyThrows
@GetMapping("getStr")
public String getStr() {
Thread.sleep(200);
return "这个方法200毫秒响应时间";
}
-
异常比例:当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
该配置在满足以下条件时会发生熔断降级:1. 5000ms内至少有5个请求。2. 5000ms内异常的比例大于80%。
-
异常数:当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。
该配置在满足一下连个条件时会发生降级熔断:1. 5000ms内至少有5个请求。2. 在5000ms内该资源的异常次数超过3次。
根据异常比例和异常数量统计时,Spring MVC的统一异常处理的优先级会大于异常统计的优先级。假如接口方法中抛出异常被异常处理捕获到,这时此异常就不会触发异常统计。如果想要Sentinel统计该异常,需要在异常统计中加如Tracer.trace([exception])
。下面是示例代码:
@RestControllerAdvice
public class GlobalExceptionHandler {
/** 接口中抛出IllegalArgumentException异常时,不会被Sentinel监控到 */
@ExceptionHandler(IllegalArgumentException.class)
public String handleIllegalArgumentException(IllegalArgumentException e) {
return e.getMessage();
}
@ExceptionHandler(Exception.class)
public String handleException(Exception e) {
/* 其余的异常交给Sentinel统计 */
Tracer.trace(e);
return e.getMessage();
}
}