直接上代码:
设置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个请求。 )不一致吗?
原提问者GitHub用户hzdavid
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
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。