一、前言
本系列是针对源码实现来讲解的。
本篇是限流器讲解的第一篇,最近在使用限流器,然后研究了下,本系列也是为了记录自己的研究成果,方便以后自己回来复习。
常用的限流器有令牌桶限流器和漏桶限流器,guava实现的限流器RateLimiter算是比较常用的应用级限流器。RateLimiter内部有两个实现:SmoothBursty和SmoothWarmingUp,这一篇先讲解SmoothBursty限流器。
SmoothBursty限流器使用令牌桶算法实现,这个限流器在空闲时候能够存储一定的令牌(默认是1秒钟时间产生的令牌),可以应对空闲一段时间后突然的爆发量请求。
guava的RateLimiter有一个核心的设计思想:当前请求的债务(请求的令牌大于限流器存储的令牌数)由下一个请求来偿还(上个请求亏欠的令牌,下个请求需要等待亏欠令牌生产出来以后才能被授权)。
二、令牌桶限流器示意图
限流器随着时间的推移会不断生产令牌,请求到来以后需要请求令牌,得到令牌以后就可以通过并开始业务处理,如果暂时没有可用的令牌则需要等待令牌的生产,待拿到令牌以后才能开始进行业务处理。
三、使用示例
这里看一下guava给出的使用示例。
- 当我们有一系列的任务需要执行,并且我们期望是每秒执行2个任务:
final RateLimiter rateLimiter = RateLimiter.create(2.0); // 速率是2令牌/秒
void submitTasks(List tasks, Executor executor) {
for (Runnable task : tasks) {
r