前言
最近一位朋友去拼夕夕面试,被问了这么一道题:限流算法有哪些?用代码实现令牌桶算法。跟星球好友讨论了一波,发现大家都忘记得差不多了.所以我再整理一波,常见的四种限流算法,以及简单代码实现,相信大家看完,会茅塞顿开的。
1. 固定窗口限流算法
1.1 什么是固定窗口限流算法
固定窗口限流算法(
Fixed Window Rate Limiting Algorithm
)是一种最简单的限流算法,其原理是在固定时间窗口(单位时间
)内限制请求的数量。该算法将时间分成固定的窗口,并在每个窗口内限制请求的数量。具体来说,算法将请求按照时间顺序放入时间窗口中,并计算该时间窗口内的请求数量,如果请求数量超出了限制,则拒绝该请求。
假设单位时间(固定时间窗口)是1
秒,限流阀值为3
。在单位时间1
秒内,每来一个请求,计数器就加1
,如果计数器累加的次数超过限流阀值3
,后续的请求全部拒绝。等到1s
结束后,计数器清0
,重新开始计数。如下图:
1.2 固定窗口限流的伪代码实现
java
复制代码
public static Integer counter = 0; //统计请求数 public static long lastAcquireTime = 0L; public static final Long windowUnit = 1000L ; //假设固定时间窗口是1000ms public static final Integer threshold = 10; // 窗口阀值是10 /** * 固定窗口时间算法 * 关注公众号:捡田螺的小男孩 * @return */ public synchronized boolean fixedWindowsTryAcquire() { long currentTime = System.currentTimeMillis(); //获取系统当前时间 if (currentTime - lastAcquireTime > windowUnit) { //检查是否在时间窗口内 counter = 0; // 计数器清0 lastAcquireTime = currentTime; //开启新的时间窗口 } if (counter < threshold) { // 小于阀值 counter++; //计数统计器加1 return true; } return false; }
1.2 固定窗口算法的优缺点
- 优点:固定窗口算法非常简单,易于实现和理解。
- 缺点:存在明显的临界问题,比如: 假设限流阀值为
5
个请求,单位时间窗口是1s
,如果我们在单位时间内的前0.8-1s
和1-1.2s
,分别并发5个请求。虽然都没有超过阀值,但是如果算0.8-1.2s,则并发数高达10,已经超过单