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

qps/并发线程数 都无法限流

private static void initFlowQpsRule() { List rules = new ArrayList(); FlowRule rule1 = new FlowRule(); rule1.setResource("hello"); rule1.setCount(4); rule1.setGrade(RuleConstant.FLOW_GRADE_THREAD); rule1.setLimitApp("default"); rules.add(rule1); FlowRuleManager.loadRules(rules); }

public static void main(String[] args) { initFlowQpsRule();

    for (int i = 0; i < 100; i++) {
        new Thread(()->{
            entry();
        }).start();
    }
}

public static void entry() { Entry methodA = null; try { methodA = SphU.entry("hello"); System.out.println(Thread.currentThread().getName() + "访问到系统资源"); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + "退出"); } catch (BlockException e1) { System.out.println(Thread.currentThread() + "被限流了"); } catch (Exception e2) { } finally { if (methodA != null) { methodA.exit(); } } }

如上文:设置了并发阈值为4,开启100个线程同时访问。结果都访问到资源,没有被限流

Thread-16访问到系统资源 Thread-97访问到系统资源 Thread-7访问到系统资源 Thread-48访问到系统资源 Thread-78访问到系统资源 Thread-17访问到系统资源 Thread-73访问到系统资源 Thread-96访问到系统资源 Thread-23访问到系统资源 Thread-98访问到系统资源 Thread-13访问到系统资源 Thread-12访问到系统资源 Thread-5访问到系统资源 Thread-74访问到系统资源 Thread-19访问到系统资源 Thread-90访问到系统资源 Thread-53访问到系统资源 Thread-50访问到系统资源 Thread-71访问到系统资源 Thread-0访问到系统资源 Thread-34访问到系统资源 Thread-1访问到系统资源 Thread-93访问到系统资源

原提问者GitHub用户WuJingLearn

展开
收起
学习娃 2023-05-19 14:55:42 95 0
1 条回答
写回答
取消 提交回答
  • 应该跟初始化过程没关系,初始化后符合预期可能是并发不够,增大并发 `public class Hi {

    private static void initFlowQpsRule() { List rules = new ArrayList(); FlowRule rule1 = new FlowRule(); rule1.setResource("hello"); rule1.setCount(4); rule1.setGrade(RuleConstant.FLOW_GRADE_QPS); rule1.setLimitApp("default"); rules.add(rule1); FlowRuleManager.loadRules(rules); }

    public static void main(String[] args) throws BlockException { initFlowQpsRule(); int thread=20; CountDownLatch latch=new CountDownLatch(thread); SphU.entry("hello"); for (int i = 0; i < thread; i++) { new Thread(()->{ latch.countDown(); try { latch.await(); entry(); } catch (InterruptedException e) { e.printStackTrace(); }

        }).start();
    }
    

    }

    public static void entry() { Entry methodA = null; try { methodA = SphU.entry("hello"); System.out.println(Thread.currentThread().getName() + "访问到系统资源"); Thread.sleep(2000); System.out.println(Thread.currentThread().getName() + "退出"); } catch (BlockException e1) { System.out.println(Thread.currentThread() + "被限流了"); } catch (Exception e2) { } finally { if (methodA != null) { methodA.exit(); } } }

    提问28.png

    原回答者GitHub用户PepoRobert

    2023-05-19 20:10:52
    赞同 展开评论 打赏

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

相关电子书

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