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

QPS不播放每秒不超过多个请求的流控制?

直接上代码:

设置qps 20, 按大家的理解,一秒钟,不能超过20个请求。 ` public class HelloSentinel {

private static void initFlowRules() { List rules = new ArrayList<>(); FlowRule rule = new FlowRule(); rule.setResource("HelloWorld"); rule.setGrade(RuleConstant.FLOW_GRADE_QPS); // Set limit QPS to 20. rule.setCount(20); rules.add(rule); FlowRuleManager.loadRules(rules); }

static { // 配置规则. initFlowRules(); }

public static String hello(String[] args) { Entry entry = null; try { entry = SphU.entry("HelloWorld"); // 资源中的逻辑. return "hello world"; } catch (BlockException e1) { return "blocked"; } finally { if (entry != null) { entry.exit(); } }

}

下面上测试程序

` public class HelloSentinelTest { @test public void testHello() { // 假设30个线程同时调用HelloSentinel的hello方法 int threadnum = 30; // 打印helloWorld次数 final AtomicInteger helloWorldCount = new AtomicInteger(0); // 打印blocked次数 final AtomicInteger blockedCount = new AtomicInteger(0); CountDownLatch latch = new CountDownLatch(threadnum); Runnable r = new Runnable() { public void run() { String result = HelloSentinel.hello(null); if ("hello world".equals(result)) { helloWorldCount.incrementAndGet(); } if ("blocked".equals(result)) { blockedCount.incrementAndGet(); } latch.countDown(); } };

for (int i = 0; i < threadnum; i++) {
	(new Thread(r)).start();
}
try {
	latch.await();
} catch (InterruptedException e) { 
	e.printStackTrace();
}
// 断言
Assert.isTrue(helloWorldCount.get() == 20, "helloWorldCount=" + helloWorldCount.get());
Assert.isTrue(blockedCount.get() == 10, "blockedCount=" + blockedCount.get());

}

测试并没有按期望的通过, 期望:helloWorld打印了20次。blocked 打印了10次。

经多次测试, helloWorld打印了30次,这不是与大家理解的(设置qps 20, 一秒钟,不能超过20个请求。 )不一致吗?

提问246.png

原提问者GitHub用户hzdavid

展开
收起
码字王 2023-05-19 19:04:02 99 0
1 条回答
写回答
取消 提交回答
  • sentinel演示基本模块为模拟QPS流量控制提供演示。 参考:https://github.com/alibaba/Sentinel/blob/master/sentinel-demo/sentinel-demo-basic/src/main/java/com/alibaba/csp/sentinel/demo/flow/FlowQpsDemo.java

    原回答者GitHub用户cdfive

    2023-05-19 21:26:50
    赞同 展开评论 打赏
问答地址:

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

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载