Guava工具类-RateLimiter类

一、概念

 RateLimiter使用一种“令牌桶“的流控算法,会按照一定的频率往桶里扔令牌,线程只有拿到令牌后才能执行,线程一旦获取到许可证后,

是不需要释放许可证的。RateLimiter常被用于限制对一些资源的 访问速率,且该速率是可配置的。具体设置方式如下:

RateLimiter limiter = RateLimiter.create(100);  //设置对资源的访问频率为每秒100次(QPS)
二、常用方法介绍

double acquire();----------------------//从RateLimiter获取一个许可,该方法会被阻塞直到获取到请求

double acquire();----------------------//从RateLimiter获取指定许可数,该方法会被阻塞直到获取到请求

boolean tryAcquire();-----------------//从RateLimiter 获取许可,如果该许可可以在无延迟下的情况下立即获取得到的话

boolean tryAcquire(int permits); ----//从RateLimiter 获取许可数,如果该许可数可以在无延迟下的情况下立即获取得到的话

构造方法如下:

static RateLimitercreate(double permitsPerSecond);

 //根据指定的稳定吞吐率创建RateLimiter,这里的吞吐率是指每秒多少许可数(通常是指QPS,每秒多少查询)

static RateLimitercreate(double permitsPerSecond,long warmupPeriod,TimeUnit unit); 

 //根据指定的稳定吞吐率和预热期来创建RateLimiter,这里的吞吐率是指每秒多少许可数(通常是指QPS,每秒多少个请求量),

//在这段预热时间内,RateLimiter每秒分配的许可数会平稳地增长直到预热期结束时达到其最大速率。(只要存在足够请求数来使其饱和)

三、举例说明

1、使用tryAcquire()方法,在获取不到许可证的情况下,立刻返回

final RateLimiter rateLimiter = RateLimiter.create(2.0);
public ResponseVo getResult(QueryParams params){
    if(!rateLimiter.tryAcquire()){  //获取不到许可证就立即放回,不需要等待
        return new ResponseVo();
    }
}
2、利用线程池来批量执行多任务的时候,可以限制任务执行的速度
final RateLimiter rateLimiter = RateLimiter.create(2.0);
public void executeTasks(TaskLists tasks,Executor executor){
    for(task : tasks){
        rateLimiter.acquire(); // 在获取不到许可证的情况下,是需要等待的
        executor.execute(task);
    }
}
四、小结

 RateLimiter请求的许可数不会影响到请求本身的限制,但会影响下一次请求的限制,比如如下代码:

RateLimiter limiter = RateLimiter.create(2.0);  
limiter.acquire(10);
limiter.acquire(); //会等待将近5s左右的时间

 注意:RateLimiter 并不提供公平性的保证

五、参考文献

并发编程网: http://ifeve.com/guava-ratelimiter/

        http://blog.csdn.net/FoolishAndStupid/article/details/76285690

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值