https://juejin.cn/post/7056000911893594148

本文介绍了分布式系统中限流的常见算法,包括令牌桶、漏桶和计数器算法,重点阐述了令牌桶算法原理及Guava的RateLimiter实现。RateLimiter通过预分配和延迟计算方式限流,有两种实现方式,介绍了其核心属性、方法及处理流程。最后指出RateLimiter适用于单机,小型项目有限流需求但引入分布式限流项目可能过重。

关联问题: RateLimiter如何分布式 漏桶算法有何优势 计数器算法怎么优化

在分布式系统中,应对高并发访问时,缓存、限流、降级是保护系统正常运行的常用方法。当请求量突发暴涨时,如果不加以限制访问,则可能导致整个系统崩溃,服务不可用。

同时有一些业务场景,比如短信验证码,或者其它第三方API调用,也需要提供必要的访问限制支持。还有一些资源消耗过大的请求,比如数据导出等,也有限制访问频率的需求。

常见的限流算法有

本文主要对三个算法的基本原理及Google Guava包中令牌桶算法的实现RateLimiter进行介绍,下一篇文章介绍最近写的一个以RateLimiter为参考的分布式限流实现及计数器限流实现。

令牌桶算法

令牌桶算法的原理就是以一个恒定的速度往桶里放入令牌,每一个请求的处理都需要从桶里先获取一个令牌,当桶里没有令牌时,则请求不会被处理,要么排队等待,要么降级处理,要么直接拒绝服务。当桶里令牌满时,新添加的令牌会被丢弃或拒绝。

令牌桶算法的处理示意图如下(图片来自网络)

image.png>](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/30ec4aef50804fa9817cf5db982aaf19~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?))

令牌桶算法主要是可以控制请求的平均处理速率,它允许预消费,即可以提前消费令牌,以应对突发请求,但是后面的请求需要为预消费买单(等待更长的时间),以满足请求处理的平均速率是一定的。

漏桶算法

漏桶算法的原理是水(请求)先进入漏桶中,漏桶以一定的速度出水(处理请求),当水流入速度大于流出速度导致水在桶内逐渐堆积直到桶满时,水会溢出(请求被拒绝)。

漏桶算法的处理示意图如下(图片来自网络)

2.png>](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2f59648113c94f22871f9355f023a326~tplv-k3u1fbpfcp-zoom-in-crop-mark:1512:0:0:0.awebp?))