GUAVA-RateLimit

    RateLimit目前这个工具类还在@Bate阶段,在官方wiki文档中,还找不到;

1.当我们使用rateLimiter,我们能够实现什么?

RateLimiter rl = RateLimiter.create(double permitsPerSecod);

通过如上的方法我们可以知道,RateLimiter可以设定一个访问速率,单位是 “秒”,这就有点类似QPS;能不能够限制并发量呢,答案是不能的;因为在RateLimiter里面只有acquire, tryAcquire,并没有release方法;而且注释里也说明了,permit一旦acquire之后,不需要release;

2.rateLimiter要如何使用?

   final RateLimiter rateLimiter = RateLimiter.create(2.0); // rate is "2 permits per second"
   void submitTasks(List<Runnable> tasks, Executor executor) {
     for (Runnable task : tasks) {
       rateLimiter.acquire(); // may wait
       executor.execute(task);
     }
   }
   final RateLimiter rateLimiter = RateLimiter.create(5000.0); // rate = 5000 permits per second
   void submitPacket(byte[] packet) {
     rateLimiter.acquire(packet.length);
     networkService.send(packet);
   }

3.使用RateLimiter有说明要注意的

    单词acquire的数字是可以大于设定的每秒请求数的,这不会对档次acquire有任何影响,但是这会直接影响后续的acquire;

    public static void main(String[] args) {
        RateLimiter rl = RateLimiter.create(2);
        for (int i = 0; i < 1000; i++) {
            rl.acquire(10);
            System.out.println(System.currentTimeMillis());
        }
    }
//输出
1601265168661
1601265173661
1601265178661
1601265183662

    可以看到每次都是间隔5秒,才会执行下一次工作

上一篇:【golang基础】golang环境变量


下一篇:RateLimiter源码