Guava令牌桶RateLimiter限流详解

说到限流,首先想到的就是信号量Semaphore,信号量在控制任务执行数量时用的比较多。今天给大家谈谈Google的令牌桶RateLimiter限流,Google出品,必属精品。

漏桶算法

如下图一样,漏桶非常均匀的控制流量,如果漏桶满了,后续的水全部会溢出,用它来作为应用层限流是不合适的。如果有大量的用户访问,会导致后面的用户全部拒绝服务,给人的感觉就像服务挂了一样。

令牌桶算法

令牌桶算法恰好相反,桶里放的不是请求,而是令牌。当请求到来时,需要从桶中拿到一个令牌才能获取服务,否则该请求会被拒绝。由于令牌桶是动态变化的,令牌消耗完了会继续往里放,因此就不存在漏桶那样后面的用户拿不到令牌的情况,是一个比较平滑的过程。

代码示例

示例代码中调用RateLimiter的create方法来创建实例,每秒生成5个令牌。实际是调用的SmoothBuisty平滑突发模式创建的实例,SmoothBuisty类里面有一个变量maxBurstSeconds,它的含义是在RateLimiter未使用时,最多存储几秒的令牌。目前这个值不支持修改,默认是1,也就是说,令牌桶最多只能存储1秒的令牌。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20200906A036E200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券