服务器后端开发

限流工具RateLimter

2018-04-01  本文已影响450人  江江的大猪

guava限流工具RateLimiter

测试代码

final AtomicInteger count = new AtomicInteger(0);
final RateLimiter limiter = RateLimiter.create(5);
//使用SmoothWarmingUp
//final RateLimiter limiter = RateLimiter.create(5, 100, TimeUnit.MILLISECONDS);
Thread.sleep(2000);//先睡两秒,此时桶里累计的令牌是5个,达到上限
Thread[] threads = new Thread[1000];
for (int i=0;i<1000;i++) {
    threads[i]=new Thread(() -> {
        limiter.acquire();//acquire()实际调用的是acquire(1),也就是消耗一个令牌
        System.out.println(new Date() + "---" + count.incrementAndGet());
    });
}
isSecond();//当是整秒时才会放行,否则阻塞,为了从整秒开始观察
for (int i=0;i<1000;i++) {
    threads[i].start();
}
for (int i=0;i<1000;i++) {
    threads[i].join();
}
//运行结果可以看出,第一秒时因为桶里此时已经有了满了有5个令牌,所以被访问了10次,再然后就稳定在5qps,如果使用SmoothWarmingUp,则不会这样
Sat Mar 31 23:38:20 CST 2018---1
Sat Mar 31 23:38:20 CST 2018---2
Sat Mar 31 23:38:20 CST 2018---3
Sat Mar 31 23:38:20 CST 2018---4
Sat Mar 31 23:38:20 CST 2018---6
Sat Mar 31 23:38:20 CST 2018---5
Sat Mar 31 23:38:20 CST 2018---7
Sat Mar 31 23:38:20 CST 2018---8
Sat Mar 31 23:38:20 CST 2018---9
Sat Mar 31 23:38:20 CST 2018---10
Sat Mar 31 23:38:21 CST 2018---11
Sat Mar 31 23:38:21 CST 2018---12
Sat Mar 31 23:38:21 CST 2018---13
Sat Mar 31 23:38:21 CST 2018---14
Sat Mar 31 23:38:21 CST 2018---15
Sat Mar 31 23:38:22 CST 2018---16
Sat Mar 31 23:38:22 CST 2018---17
Sat Mar 31 23:38:22 CST 2018---18
Sat Mar 31 23:38:22 CST 2018---19
Sat Mar 31 23:38:22 CST 2018---20

所以SmoothBursty可以保证大流量时(令牌的需求量大于产生量),qps可以保持在稳定值。反之由于令牌可以保存,qps会高于稳定值。SmoothWarmingUp则会保证qps永远都不超过设定值

上一篇 下一篇

猜你喜欢

热点阅读