1

计数器法

  1. 有一个十分致命的问题,那就是临界问题。
  2. 可以看成是滑动窗口的低精度实现。
  3. 比如每5分钟允许500个请求,可能在第一秒或者最后一秒突然来500个请求。

滑动窗口

  1. 滑动窗口由于需要存储多份的计数器,所以滑动窗口在实现上需要更多的存储空间。
  2. 会发生单位时间的前半段有大量的请求涌入,而后半段则拒绝所有请求的情况发生。

漏桶算法

  1. 漏桶算法能强行限制数据的传输速率,不能突发传输。
  2. 主要目的是控制数据注入到网络的速率,平滑网络上的突发流量。
  3. 漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。

令牌桶算法

  1. 令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。
  2. 令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。
  3. 如果希望程序QPS不要超过1000,那么每秒往桶里扔1000个令牌。
  4. 虽然令牌桶算法允许突发速率,但是下一个突发速率必须要等桶内有足够的token后才能发生。
  5. 令牌桶算法由于实现简单,且允许某些流量的突发,对用户友好,所以被业界采用得较多。

区别

  1. 漏桶算法能够强行限制数据的传输速率,不允许突发传输。
  2. 令牌桶算法能够限制数据的平均传输速率外,还允许某种程度的突发传输。
  3. 令牌桶算法只要令牌桶中存在令牌,那么就允许突发地传输数据,直到达到用户配置的阀值,所以它适合于具有突发特性的流量。

方案

Guava的RateLimiter(java)

Semphore(java)


xxfaxy
1.6k 声望18 粉丝