开发者社区 > 云原生 > 正文

对限流规则里的线程数有疑问

此处是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

展开
收起
码字王 2023-05-19 19:11:24 92 0
1 条回答
写回答
取消 提交回答
  • 通过的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

    2023-05-19 22:46:07
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
多IO线程优化版 立即下载
低代码开发师(初级)实战教程 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载