算法

时间窗

固定窗口

image.png
优点: 简单
缺点: 临界问题,

滑动窗口

image.png

桶算法

漏桶和令牌桶,虽然都是应对突然流量。令牌桶的“允许突发”实际上只是“允许一定程度的突发”,比如系统处理能力是每秒 100 TPS,突发到 120 TPS 是可以的,但如果突发到 1000 TPS 的话,系统大概率就被压垮了。所以处理秒杀时高并发流量,还是得用漏桶算法. 漏桶算法的桶容量可以设计为 100 万,但是一个每秒 30 TPS 的令牌桶,桶的容量可能只能设计成 40 左右

漏桶(本质上是总量控制)

漏桶算法的实现原理是,将请求放入“桶”(消息队列等),业务处理单元(线程、进程和应用等)从桶里拿请求处理,桶满则丢弃新的请求。

image.png

  1. 流入速度不固定,适合秒杀等场景
  2. 匀速流出,保证系统不被打垮
  3. 桶满则放弃请求。

令牌桶(本质上是流速控制)

桶中放入的不是请求,而是“令牌”,这个令牌就是业务处理前需要拿到的“许可证”。也就是说,当系统收到一个请求时,先要到令牌桶里面拿“令牌”,拿到令牌才能进一步处理,拿不到就要丢弃请求。
image.png

经典场景:

  1. 需要控制访问第三方服务的速度,防止把下游压垮,例如支付宝需要控制访问银行接口的速率;
  2. 需要控制自己的处理速度,防止过载,例如压测结果显示系统最大处理 TPS 是 100,那么就可以用令牌桶来限制最大的处理速度

开源实现

参考资料

极客时间-如何应对接口级的故障?

限流器设计