1. 为什么需要用户级窗口限流
在Web服务开发中,限流是保护系统稳定性的重要手段。用户级窗口限流特指针对单个用户在一定时间窗口内的请求频率进行限制,这种细粒度的控制方式能有效防止以下问题:
- 恶意刷接口:防止单个用户通过脚本高频调用API
- 资源滥用:避免少数用户占用过多服务器资源
- CC攻击防护:缓解应用层DDoS攻击的影响
- 业务公平性:确保所有用户能公平使用服务资源
典型的应用场景包括:
- 短信验证码接口防爆破
- 商品抢购防机器人
- API平台配额管理
- 用户行为异常检测
提示:窗口限流与普通限流的区别在于,它会统计固定时间区间内的请求总数,而非简单限制瞬时并发量。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 滑动窗口算法实现原理
2.1 基础计数器的问题
传统计数器法(如每分钟限制100次)存在临界问题:在时间窗口切换时,前1秒和后1秒可能各通过100请求,实际在2秒内通过了200请求。
2.2 滑动窗口数据结构
我们采用环形队列实现时间片统计:
python复制class SlidingWindow:
def __init__(self, window_size, limit):
self.window_size = window_size # 时间窗口长度(秒)
self.limit = limit # 窗口内最大请求数
self.queue = deque() # 存储请求时间戳
2.3 请求处理流程
当新请求到达时:
- 清除队列中过期的时间戳(当前时间 - 时间戳 > window_size)
- 检查当前队列长度是否超过limit
- 如果未超限,将当前时间戳加入队列
- 返回是否允许通过的布尔值
python复制def allow_request(self):
now = time.time()
# 移除过期记录
while self.queue and now - self.queue[0] > self.window_size:
self.queue.popleft()
if len(sel
