常见限流算法
- 固定窗口
- 滑动窗口
- 漏斗算法
- 令牌桶
- 滑动日志
- 分布式限流
固定窗口
固定窗口限流算法,是维护一个时间窗口和一个计数器,在这个时间窗口内,请求数达到一定的限制后,则不再接受请求,若检测到超过窗口时间,则将计数器置为0
具体实现代码如下
public class FixWindow implements LimitingAlgorithm {
// 窗口时间,单位为ms
private long windowSize;
// 窗口时间内次数
private long limit;
// 当前窗口次数
private long count;
// 上一窗口的开始时间
private long lastWindowStartTime = System.currentTimeMillis();
public FixWindow(long windowSize, long limit) {
this.windowSize = windowSize;
this.limit = limit;
}
@Override
public synchronized boolean tryAcquire() {
System.out.println(count);
long now = System.currentTimeMillis();
if (now - lastWindowStartTime < windowSize) {
// 在窗口期间内
if (count < limit) {
count++;
return true;
} else {
return false;
}
}
count = 1;
lastWindowStartTime = now;
return true;
}
}
- 优点:易于实现,内存占用小
- 缺点:有临界问题,可能在两个窗口变更的交接处,流量瞬间达到2n
滑动窗口
滑动窗口是固定窗口的优化版