Guava
Guava是Google下的一个核心库,提供了一大批设计精良、使用方便的工具类。许多Java项目都使用Guava作为其基础工具来提升开发效率,我们可以认为Guava是JDK标准库的重要补充,其中有代表性的有Guava中的一款限流工具RateLimiter。
在任何应用和模块组件都有一定的访问频率上限,如果请求速率突破了这个上限,不但多余的请求无法处理,甚至会压垮系统使得所有的请求均无法有效处理。因此对请求进行限流是非常必要的。
这里提供了两种限流算法:漏桶算法和令牌桶算法
漏桶算法
基本思想:利用一个缓存区,当有请求进入系统时,无论请求的速率如何,都现在缓存区内保存,然后以固定的流速流出缓存区进行处理。
特点:无论外部压力如何,总是以固定的流速处理数据。
令牌桶算法
基本思想:在令牌桶算法中,桶中存放的不再是请求,而是令牌。处理程序只有拿到令牌后,才能对请求进行处理。如果没有令牌,那么处理程序要么丢弃请求,要么等待可用的令牌。为了限制流速,该算法在每个单位时间产生一定量的令牌存入桶中。通常桶的容量是有限的,当令牌没有被消耗掉时,只能累计有限单位时间内的令牌数量。其中RateLimiter正是采用了令牌桶算法。