Guava限流
在Guava中提供的限流算法是令牌桶算法。默认是SmoothBursty模式。
Guava实现与理论会有点不同。从理论上来看,令牌会定时地被加入到桶中,而在Guava的实现中,并没有定时器在运行,因为定时器这种实现方式太浪费资源。Guava使用的是基于时间差的令牌延时生成算法,具体来说,有以下两点:
- 延时:只有到需要使用限流器时,才去计算。如果新建了限流器,但一直没使用,这个限流器是不会去生成令牌的。
- 时间差:需要生成令牌时,会拿当前时间与最后一次生成的时间做一个是时间差,然后根据生成速率可以计算出这段时间应该有多少个令牌生成。
另外,Guava提供的限流器是不保证公平的。因为Guava使用synchronized来锁操作,而synchronized锁是非公平的。
创建限流器的时候会启动一个计时器,记录下创建时的时间。
1 | //限流器获取令牌 |