在高并发的分布式系统,如大型电商系统中,由于接口 API 无法控制上游调用方的行为,因此当瞬间请求量突增时,会导致服务器占用过多资源,发生响应速度降低、超时乃至宕机,甚至引发雪崩造成整个系统不可用。
面对这种情况,一方面我们会提升 API 的吞吐量和 QPS(Query Per Second 每秒查询量),但总归会有上限,所以另一方面为了应对巨大流量的瞬间提交,我们需要做对应的限流处理,也就是对请求量进行限制,对于超出限制部分的请求作出快速拒绝、快速失败、丢弃处理,以保证本服务以及下游资源系统的稳定。
常见的限流算法有计数器、漏斗、令牌桶。
一、计数器
1. 设计思路#
计数器限流方式比较粗暴,一次访问就增加一次计数,在系统内设置每 N 秒的访问量,超过访问量的访问直接丢弃,从而实现限流访问。具体大概是以下步骤:
-
将时间划分为固定的窗口大小,例如 1 s;
-
在窗口时间段内,每来一个请求,对计数器加 1;
-
当计数器达到设定限制后,该窗口时间内的后续请求都将被丢弃;
-
该窗口时间结束后,计数器清零,从新开始计数。
这种算法的弊端是,在开始的时间,访问量被使用完后,1 s