四种经典算法:固定窗口——每分钟计数清零,实现最简,但窗口边界可被 2 倍速率击穿;滑动窗口——记录每个请求时间戳或按小格计数,平滑但存储开销大;漏桶——请求进桶、恒定速率流出,强行削平流量,适合保护下游恒速系统,代价是突发全排队;令牌桶——恒定速率产令牌、请求取令牌,允许桶容量内的突发,是工程上最常用的折中(Guava RateLimiter、Nginx limit_req 的核心)。
分布式限流是进阶考点:单机限流简单,集群下要共享计数——1)Redis + Lua 把「读计数-判断-写回」做成原子脚本,是标准答案;2)一致性容忍度高的场景可用本地限流 + 配额下发(中心按节点数分配额度),减少每次请求的网络往返;3)完全精确的全局限流成本与延迟都高,通常「近似但快」优于「精确但慢」。设计层面还要回答:限流维度(用户/IP/接口/租户多级)、被限后的行为(429 + Retry-After、排队、降级)、阈值动态配置下发。追问方向:漏桶与令牌桶在突发处理上的数学差异、滑动窗口用 Redis ZSet 实现的开销与近似窗口(固定小窗 + 加权)优化、预热限流(Guava SmoothWarmingUp)解决冷启动冲击。
(约 450 字)