此处是FlowThreadDemo的关键代码.
Entry methodA = null;
try {
TimeUnit.MILLISECONDS.sleep(5);
methodA = SphU.entry("methodA");
activeThread.incrementAndGet();
Entry methodB = SphU.entry("methodB");
TimeUnit.MILLISECONDS.sleep(methodBRunningTime);
methodB.exit();
pass.addAndGet(1);
} catch (BlockException e1) {
block.incrementAndGet();
} catch (Exception e2) {
// biz exception
} finally {
total.incrementAndGet();
if (methodA != null) {
methodA.exit();
activeThread.decrementAndGet();
}
}
private static void initFlowRule() { List rules = new ArrayList(); FlowRule rule1 = new FlowRule(); rule1.setResource("methodA"); // set limit concurrent thread for 'methodA' to 20 rule1.setCount(20); rule1.setGrade(RuleConstant.FLOW_GRADE_THREAD); rule1.setLimitApp("default");
rules.add(rule1);
FlowRuleManager.loadRules(rules);
}
以下是打印的日志
我的疑问是这个限流规则 不是说每秒最多20个线程通过吗. ..... 为什么后面当methodBRunningTime时间变短了后 突然一下子通过这么多.....
16 total qps is: 14069 1546419694446, total:14069, pass:801, block:13268 activeThread:21 15 total qps is: 14136 1546419695452, total:14136, pass:809, block:13326 activeThread:19 14 total qps is: 14249 1546419696455, total:14249, pass:808, block:13442 activeThread:20 13 total qps is: 14061 1546419697459, total:14061, pass:794, block:13266 activeThread:20 12 total qps is: 14092
原提问者GitHub用户huihui1112
通过的800左右是统计的qps,设置的20是线程数的阈值。
rule1.setGrade(RuleConstant.FLOW_GRADE_THREAD);// 按线程数限流; rule1.setCount(20);// 阈值是20,表示同时最大20个线程,超过则限流;
后面methodBRunningTime变短为20ms,试想: 方法耗时20ms,如果只有1个线程跑,那么1秒可以跑1000/20=50个; 最大20个线程,20*50=1000,也就是1秒内最大的qps为1000, 在程序中除了TimeUnit.MILLISECONDS.sleep(methodBRunningTime);20ms还有一些其它代码的执行消耗,加上实时统计的误差,所以看到pass在800-1000之间。
如果把阈值20改为1,那么这时1秒跑50个,可以看到后面的pass在50左右。
估计你是看前面几十秒pass出现了很多20,后面突然变大的原因,自己也曾有此疑惑。
最开始methodBRunningTime=2000ms,跟20ms不同,不能直接20*(1000/2000)=10来算, 因为大于1秒,而20个线程几乎是同时跑的,然后一起休眠2秒,所以输出的pass大概是 0 20 0 20 ...
参考: https://github.com/alibaba/Sentinel/wiki/如何使用#流量控制规则-flowrule
原回答者GitHub用户cdfive
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。