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