算法
时间窗
固定窗口
优点: 简单
缺点: 临界问题,
滑动窗口
桶算法
漏桶和令牌桶,虽然都是应对突然流量。令牌桶的“允许突发”实际上只是“允许一定程度的突发”,比如系统处理能力是每秒 100 TPS,突发到 120 TPS 是可以的,但如果突发到 1000 TPS 的话,系统大概率就被压垮了。所以处理秒杀时高并发流量,还是得用漏桶算法. 漏桶算法的桶容量可以设计为 100 万,但是一个每秒 30 TPS 的令牌桶,桶的容量可能只能设计成 40 左右
漏桶(本质上是总量控制)
漏桶算法的实现原理是,将请求放入“桶”(消息队列等),业务处理单元(线程、进程和应用等)从桶里拿请求处理,桶满则丢弃新的请求。
- 流入速度不固定,适合秒杀等场景
- 匀速流出,保证系统不被打垮
- 桶满则放弃请求。
令牌桶(本质上是流速控制)
桶中放入的不是请求,而是“令牌”,这个令牌就是业务处理前需要拿到的“许可证”。也就是说,当系统收到一个请求时,先要到令牌桶里面拿“令牌”,拿到令牌才能进一步处理,拿不到就要丢弃请求。
经典场景:
- 需要控制访问第三方服务的速度,防止把下游压垮,例如支付宝需要控制访问银行接口的速率;
- 需要控制自己的处理速度,防止过载,例如压测结果显示系统最大处理 TPS 是 100,那么就可以用令牌桶来限制最大的处理速度