码迷,mamicode.com
首页 > 其他好文 > 详细

Guava的RateLimiter在单机限流中的正确用法

时间:2018-07-03 20:07:03      阅读:419      评论:0      收藏:0      [点我收藏+]

标签:使用   iter   没有   一个   请求   ota   项目   写法   call   

错误使用

在实现限流时,网上的各种文章基本都会提到Guava的RateLimiter,用于实现单机的限流,并给出类似的代码:

public void method() {
    RateLimiter rateLimiter = RateLimiter.create(10);
    if(rateLimiter.tryAcquire()){
        // do business
        ......
    }
}

可是上面的代码真的能限流吗?

首先,从代码逻辑角度来讲,方法在每次被调用是都new一个RateLimiter,不同请求之间毫无关联,怎么能起到限流的作用呢?

其次,经过本人实际验证,上面的方法运行结果表明,根本没有限流的作用。

正确使用

在SpringMVC项目中,controller、service等对应的bean都是单例,因此将RateLimiter作为bean的属性并初始化,再加上RateLimiter的注释中表示RateLimiter是并发安全的:

RateLimiter is safe for concurrent use: It will restrict the total rate of calls from all threads. Note, however, that it does not guarantee fairness.

因此,正确的写法如下:

private RateLimiter rateLimiter = RateLimiter.create(10);

public void method() {
    if(rateLimiter.tryAcquire()){
        // do business
        ......
    }
}

Guava的RateLimiter在单机限流中的正确用法

标签:使用   iter   没有   一个   请求   ota   项目   写法   call   

原文地址:https://www.cnblogs.com/acode/p/9260068.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!