知识卡片
流量计数器的离散统计缺陷与滑动时间窗的平滑解法
内容
最直观的限流做法是设一个计数器,按固定时间点(如每秒)统计请求数是否 超过阈值,但这种”离散时间点统计”存在两个反直觉的漏洞。漏洞一:即使每 个统计周期都没超过阈值,系统实际承受的瞬时压力也可能已经超限——比如 连续两秒各收到60 TPS,但都恰好集中在各自周期的后半秒和前半秒,跨周期 拼接起来这1秒内实际发生了120 TPS的冲击,固定周期统计完全无法捕捉这种 “骑跨”现象。漏洞二:即使连续若干秒的统计流量都超过阈值,也不代表系统 真的处理不过来——如果前3秒平均100 TPS、后7秒平均30 TPS,只要总超时 时间够长(如10秒),系统依然能在超时前处理完,此时如果死板地按固定 阈值80 TPS拒绝流量,反而会”误杀”本可以正常完成的请求。这两个漏洞的 共同根源是流量计数器只做”时间点”上的离散快照,而不是对”时间片段”做连续 观察。滑动时间窗模式的解法是维护一个固定大小的窗口随时间平滑向前滚动 (常用双头队列实现,每格代表1秒的统计Bucket,每秒定时器触发时丢弃最旧 一格、插入新的一格),这样任意时刻观察到的窗口内容,都等价于一段连续 流动的时间片段的真实压力,从根源上避免了”骑跨误判”和”固定周期误杀”两个 问题。代价是滑动时间窗只适合否决式限流(超阈值直接拒绝/降级),很难 支持阻塞排队、也难对流量曲线做细粒度整形(削峰填谷)。
参考来源
- 位置:《凤凰架构:构建可靠的大型分布式系统》第8章"流量治理"8.2.2节
"限流设计模式"(源文件:_epub-src对应OEBPS/Text/chapter102.xhtml)
- 结论依据:原文用两个具体反例证明流量计数器模式的统计缺陷(跨周期
骑跨导致漏判、固定周期误杀本可完成的请求),并说明滑动时间窗通过窗口
随时间平滑滚动来弥补这一缺陷,同时指出其只适用于否决式限流的局限,
直接支撑本卡片结论。
- 原始内容:即使每一秒的统计流量都没有超过80 TPS,也不能说明系统没有
遇到过大于80 TPS的流量压力……流量计数器的缺陷根源在于它只是针对时间点
进行离散的统计,为了弥补该缺陷,一种名为"滑动时间窗"的限流模式被
设计出来。