1. 概念解释
熔断策略慢调用比例是以慢调用数量的比例作为阈值,首先需要设置最大 RT(即最大的响应时间,用于鉴定是否是慢调用),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs
)内请求数大于设置的最小请求数,并且慢调用的比例大于比例阈值,则接下来的请求会自动熔断,熔断时间为设置的熔断时长。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若在HALF-OPEN状态下有一个请求响应时间小于 最大RT 则结束熔断,否则继续熔断。
具体设置如下图:
字段说明表格
字段名 | 说明 |
---|---|
资源名 | 访问的请求路径 |
熔断策略 | 熔断规则配置后,进行熔断的方式策略,本文主要分析慢调用比例 |
最大RT | 最大响应时间,单位:毫秒数,用于鉴定是否是慢调用 |
比例阈值 | 值的是慢调用的比例阈值,是触发熔断的其中一个条件 |
熔断时长 | 当条件满足后需要进行熔断的熔断时长,单位:秒 |
最小请求数 | 在统计时长的时间内,请求数要大于该值,才会判断慢调用比例是否大于比例阈值, 所以最小请求数是触发熔断的另外一个条件 |
统计时长 | 触发熔断需要统计请求数的时长,单位:毫秒 |
帮助理解图
2. 案例演示
首先我们需要添加一个控制器,这个控制器中的调用资源方法中sleep500毫秒,方便被标记成慢调用, 同时支持不慢调用请求,isShow=false时
@GetMapping("/testA")
public String testA(boolean isSlow) {
if(isSlow) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
return "-----testA - ";
}
设置熔断规则
上面的熔断规则表示说: 访问/testA资源时,如果在1000毫秒内,请求数量超过5,并且这些数量中超过300毫秒的请求数量的比例超过0.5则熔断5秒,5秒后进入半开状态,如果半开状态中有一个请求小于300毫秒,则取消熔断,否则继续熔断
3. 理论实践
为了展示效果
- 我们要支持在同一个资源上慢调用请求(请求响应超过300毫秒)和非慢调用请求(请求马上得到响应
慢调用地址 http://127.0.0.1:8401/testA?isSlow=true 非慢调用地址 http://127.0.0.1:8401/testA?isSlow=false -
在JMeter中开启6个线程同时请求慢调用地址,并启动JMeter
-
这时候,/testA资源会进入一个5秒的熔断时长。 我们在这个时间内请求非慢调用地址,会被熔断
-
测试完以上情况后,停止JMeter,在5秒后再次请求慢调用地址,那么会继续熔断
-
测试完以上情况后,停止JMeter,那么会在5秒后取消熔断