高并发下的限流算法

计数器法

  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)java

Semphore(java)算法

相关文章
相关标签/搜索