限流-固定时间窗口算法

1,493 阅读2分钟

本文介绍了固定时间窗口限流算法。

前言

首先限流的算法有很多种,比如固定时间窗口限流算法、滑动时间窗口算法、漏桶算法、令牌桶算法,其余的算法后续我们会一一介绍。

一、限流场景

站在服务调用方的角度来说,限流的场景大体分为两类。

  • 对外提供服务

    用户通过某种形式调用到了我们的服务,比如提供了web服务。

    (1)用户增长速度太快。请求量一下子上来了,接口扛不住压力

    (2)爬虫

    (3)热点事件。比如公司上市成功曝光度增加,从而导致访问用户量增加。

    (4)刷单。有的公司甚至主动为用户提供刷单工具,就会导致服务的请求量暴增。

  • 对内提供服务

    当前存在A、B、C、D四个服务,A服务同时被B、C、D服务调用,如果B服务的请求量暴增,导致A服务宕机,同时就会导致C、D服务也无法使用,这种情况就不太合适。

20210717090722887.jpg

二、算法原理

固定时间内只允许通过一定数据量请求,超出的请求数则会被拦截。

20210716073433157.jpg

缺点:

这种方式下我们假定的是请求均匀分布,如果请求数据只集中在时间窗口内的某一个时间段,那么就可能超出承受范围,如下图所示。

20210716074555408.jpg

三、代码实现

public class FixedTimeWindow {

    public static final Integer DURATION = 1 * 1000; // 时间窗口大小,单位毫秒

    public static final Integer MAX_COUNT = 100; // 允许的最大请求次数

    public static Integer curCount = 0; // 当前请求次数

    public static Long endTime = new Date().getTime(); // 当前时间窗口的开始时间

    public boolean limit() {
        long currentTime = new Date().getTime();

        // 是否已经不在当前时间窗口范围内了
        if (currentTime > endTime) {
            endTime = currentTime + DURATION;
            curCount = 1;
            return true;
        } else { // 处于当前时间窗口
            curCount = curCount + 1;
            return curCount < MAX_COUNT;
        }
    }
}