固定窗口算法又称为计数器算法,通过计数器计算周期内的请求总数,达到设定的请求阈值时就会被限流;进入下一个周期时,计数器清零。
public class FixedWindow {
/**
* 请求阈值
*/
private static final Integer THRESHOLD = 2;
/**
* 窗口时间长度
*/
private static final Integer WINDOW_TIME = 1000;
/**
* 请求计数器
*/
private static final AtomicInteger COUNTER = new AtomicInteger(0);
/**
* 当前窗口开始时间
*/
private static long startTime = System.currentTimeMillis();
/**
* 尝试获取许可
*/
public synchronized static boolean tryAcquire() {
// 进入下一个窗口
long currentTime = System.currentTimeMillis();
if (currentTime - startTime > WINDOW_TIME) {
COUNTER.set(0);
startTime = currentTime;
}
return COUNTER.incrementAndGet() <= THRESHOLD;
}
}
参数说明:
- THRESHOLD:单个窗口内的请求阈值,超过阈值返回false;
- WINDOW_TIME:单个窗口的时间长度;
- COUNTER:请求计数器,单个窗口内不断累加,进入新的窗口计数清零;
- startTime:当前窗口的开始时间;
实现思路:
- 判断请求是否是在当前的窗口内
- 1 不在当前窗口内,更新窗口开始时间,计数器清零,执行2
- 2 在当前窗口内,计数器累加,没有超过阈值可以处理请求,超过阈值拒绝请求