限流算法之固定窗口算法

102 阅读1分钟

固定窗口算法又称为计数器算法,通过计数器计算周期内的请求总数,达到设定的请求阈值时就会被限流;进入下一个周期时,计数器清零。

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 在当前窗口内,计数器累加,没有超过阈值可以处理请求,超过阈值拒绝请求