接口限流常用算法实践
背景
为了更好的说明几种算法,我们举个例子,下文就这个例子分别几种算法实现。
- 如何限制每分钟访问
/api/books
接口不能超过 120 次 ?
我们先定义一个接口:
1 | interface RateLimiter |
固定时间窗口算法
固定时间窗口算法又叫计数器算法,逻辑就是对固定时间段内的访问次数进行计数,如果计数结果超过次数限制,则拒绝访问。
固定时间窗口算法的劣势就在于其只关心时间段内的总访问次数,而忽略了瞬间集中请求的问题,换而言之,这种统计方法的粒度太粗了,然而我们无法保证请求在时间段内的分布是平均的。
举个例子,如果 A 用户访问接口的时间分布如下:
时间段 | 访问次数 |
---|---|
00:00 ~ 00:30 | 20 |
00:30 ~ 01:00 | 100 |
01:00 ~ 01:30 | 100 |
01:30 ~ 02:00 | 20 |
显然在第一分钟,我们有 120 次请求,第二分钟也是 120 次请求,但是 00:30 ~ 01:30
这一分钟时间内,显然是请求书超过 120 次的,所以,这种情况虽然实现了需求,但是很勉强,粒度不够细。