Post

常见限流算法

计数器固定窗口算法

img.png

原理:

  • 一个时间窗口内对请求计数,超过阀值则丢弃
  • 时间窗口结束,同时重置计数器为0

优点:

  • 实现简单

缺点:

  • 一个时间窗口内服务不可用;例如时间窗口为1s,限流100。在1ms时来了100个请求,后面999ms的请求会感觉系统不可用
  • 窗口切换临界会出现2倍阀值流量;例如时间窗口为1s,限流100。在0-998ms没有请求,在999ms来了100请求。在下个时间窗口1ms时来了100请求。也就在2ms内通过了100 * 1个请求

计数器滑动时间窗口算法

img.png

原理:

  • 一个时间窗口被划分成若干个小时间窗口(计数器固定窗口),每个小时间窗口内对请求单独计数,超过阀值则丢弃
  • 滑动;小窗口结束时,第1个小窗口丢弃,并在最后增加1个小时间窗口

优点:

  • 解决了计数器固定时间窗口算法在窗口切换时,可能出现2倍请求阀值问题
  • 和漏斗算法相比,新来的请求也能被处理到,避免漏斗算法饥饿问题

漏斗(桶)算法

img.png

原理:

  • 请求以不同的速度进入桶
  • 桶容量可以缓存n个请求,超过桶容量则丢弃
  • 请求以恒定速度出桶,被系统请求

优点:

  • 漏桶流出速率是固定的

缺点:

  • 不能解决突发流量问题;突发流量仅在桶中缓存,并没有被系统处理

令牌桶算法

img.png

原理:

  • 匀速产生令牌放到桶中
  • 请求经过时,从桶中获取1个令牌并消耗,桶中没有令牌则拒绝请求

优点:

  • 允许一定程度的突发流量

总结

  • 是否允许一定程度突发流量是漏斗算法和令牌桶算法的主要区别

参考

  • https://juejin.cn/post/6870396751178629127
This post is licensed under CC BY 4.0 by the author.