计数器法
- 有一个十分致命的问题,那就是临界问题。
- 可以看成是滑动窗口的低精度实现。
- 比如每5分钟允许500个请求,可能在第一秒或者最后一秒突然来500个请求。
滑动窗口
- 滑动窗口由于需要存储多份的计数器,所以滑动窗口在实现上需要更多的存储空间。
- 会发生单位时间的前半段有大量的请求涌入,而后半段则拒绝所有请求的情况发生。
漏桶算法
- 漏桶算法能强行限制数据的传输速率,不能突发传输。
- 主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。
- 漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。
令牌桶算法
- 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。
- 令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。
- 如果希望程序QPS不要超过1000,那么每秒往桶里扔1000个令牌。
- 虽然令牌桶算法允许突发速率,但是下一个突发速率必须要等桶内有足够的token后才能发生。
- 令牌桶算法由于实现简单,且允许某些流量的突发,对用户友好,所以被业界采用得较多。
区别
- 漏桶算法能够强行限制数据的传输速率,不允许突发传输。
- 令牌桶算法能够限制数据的平均传输速率外,还允许某种程度的突发传输。
- 令牌桶算法只要令牌桶中存在令牌,那么就允许突发地传输数据,直到达到用户配置的阀值,所以它适合于具有突发特性的流量。
方案
Guava的RateLimiter(java)
Semphore(java)
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。