为什么sentinel的流量控制不准,而且处理模式为 均速排队时不生效?
业务代码:
@Service
public class SentinelServiceImpl implements SentinelService {
private final AtomicInteger NUM = new AtomicInteger(0);
@PostConstruct
private void initFlowRules(){
System.out.println("init sentinel rules");
List<FlowRule> rules = new ArrayList<>();
FlowRule rule = new FlowRule();
rule.setResource("name");
//0线程,1QPS
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//处理模式
//直接拒绝:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)方式是默认的
//Warm Up:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,即预热/冷启动
//均速排队:(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER)
rule.setControlBehavior(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER);
// 阈值
rule.setCount(2);
rules.add(rule);
FlowRuleManager.loadRules(rules);
}
@SentinelResource(value = "name",blockHandler = "reject")
@Override
public String getMsg() {
int andIncrement = NUM.getAndIncrement();
System.out.println(new Date() + ":get msg success :" + andIncrement);
return "success" + andIncrement;
}
public String reject(BlockException ex){
int andIncrement = NUM.getAndIncrement();
System.out.println(new Date() + ":blockHandler:" + andIncrement);
return "reject" + andIncrement;
}
}
设置QPS为2,模式为 匀速排队,看看调用方的同时发生10个请求的结果:
1682674982090--> result:success1
1682674982090--> result:success0
1682674982090--> result:reject3
1682674982090--> result:success2
1682674982093--> result:reject4
1682674982095--> result:reject5
1682674982095--> result:reject7
1682674982096--> result:reject6
1682674982098--> result:reject8
1682674982552--> result:success9
首先一秒了通过了4个请求,其次超流量的请求没有排队等待处理,而是直接走了拒绝了