简介
常用的限流算法有漏桶算法和令牌桶算法,guava 的 RateLimiter 使用的是令牌桶算法,也就是以固定的频率向桶中放入令牌,例如一秒钟 10 枚令牌,实际业务在每次响应请求之前都从桶中获取令牌,只有取到令牌的请求才会被成功响应,获取的方式有两种:阻塞等待令牌或者取不到立即返回失败。
添加 guava jar 包
1 | <dependency> |
RateLimiter 方法摘要
修饰符和类型 | 方法和描述 |
---|---|
double | acquire() 从 RateLimiter 获取一个许可,该方法会被阻塞直到获取到请求 |
double | acquire(int permits) 从 RateLimiter 获取指定许可数,该方法会被阻塞直到获取到请求 |
static RateLimiter | create (double permitsPerSecond) 根据指定的稳定吞吐率创建 RateLimiter,这里的吞吐率是指每秒多少许可数(通常是指 QPS,每秒多少查询) |
static RateLimiter | create(double permitsPerSecond, long warmupPeriod, TimeUnit unit) 根据指定的稳定吞吐率和预热期来创建 RateLimiter,这里的吞吐率是指每秒多少许可数(通常是指 QPS,每秒多少个请求量),在这段预热时间内,RateLimiter 每秒分配的许可数会平稳地增长直到预热期结束时达到其最大速率。(只要存在足够请求数来使其饱和) |
double | getRate() 返回 RateLimiter 配置中的稳定速率,该速率单位是每秒多少许可数 |
void | setRate(double permitsPerSecond) 更新 RateLimite 的稳定速率,参数 permitsPerSecond 由构造 RateLimiter 的工厂方法提供。 |
String | toString () 返回对象的字符表现形式 |
boolean | tryAcquire() 从 RateLimiter 获取许可,如果该许可可以在无延迟下的情况下立即获取得到的话 |
boolean | tryAcquire(int permits) 从 RateLimiter 获取许可数,如果该许可数可以在无延迟下的情况下立即获取得到的话 |
boolean | tryAcquire(int permits, long timeout, TimeUnit unit) 从 RateLimiter 获取指定许可数如果该许可数可以在不超过 timeout 的时间内获取得到的话,或者如果无法在 timeout 过期之前获取得到许可数的话,那么立即返回 false (无需等待) |
boolean | tryAcquire(long timeout, TimeUnit unit) 从 RateLimiter 获取许可如果该许可可以在不超过 timeout 的时间内获取得到的话,或者如果无法在 timeout 过期之前获取得到许可的话,那么立即返回 false(无需等待) |
示例1
1 | // 速率是每秒两个许可 |
示例2
1 |
|