本文介绍了固定时间窗口限流算法。
前言
首先限流的算法有很多种,比如固定时间窗口限流算法、滑动时间窗口算法、漏桶算法、令牌桶算法,其余的算法后续我们会一一介绍。
一、限流场景
站在服务调用方的角度来说,限流的场景大体分为两类。
-
对外提供服务
用户通过某种形式调用到了我们的服务,比如提供了web服务。
(1)用户增长速度太快。请求量一下子上来了,接口扛不住压力
(2)爬虫
(3)热点事件。比如公司上市成功曝光度增加,从而导致访问用户量增加。
(4)刷单。有的公司甚至主动为用户提供刷单工具,就会导致服务的请求量暴增。
-
对内提供服务
当前存在A、B、C、D四个服务,A服务同时被B、C、D服务调用,如果B服务的请求量暴增,导致A服务宕机,同时就会导致C、D服务也无法使用,这种情况就不太合适,如图1.1所示。
二、算法原理
固定时间内只允许通过一定数据量请求,超出的请求数则会被拦截,如图2.1所示。
缺点:
这种方式下我们假定的是请求均匀分布,如果请求数据只集中在时间窗口内的某一个时间段,那么就可能超出承受范围,如下图2.2所示。
三、代码实现
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;
}
}
}