标准答案
- 固定窗口按时间段计数,适合实现简单的粗粒度配额,但窗口边界可能允许短时间双倍流量。
- 滑动窗口按最近一段时间计算,更准确地限制连续流量,但需要保存更多时间片或事件。
- 令牌桶按速率产生令牌并允许积累,适合允许一定突发但控制长期平均速率的 API。
- 漏桶按固定速率处理或排出,适合平滑下游压力,但突发可能排队或被拒绝。
题目解析
固定窗口实现简单,但窗口边界可能让两个相邻窗口的请求集中在极短时间内通过;滑动窗口更接近真实时间范围,代价是计数存储和计算更高。
令牌桶适合允许可控突发的 API:令牌按平均速率补充,桶容量决定最多能吸收多大的瞬时流量。漏桶更强调稳定流出,突发会转化为排队或拒绝。
分布式限流还要说明计数器的一致性、时钟、网络延迟、故障时的默认行为和超限反馈。算法名称本身不能证明策略在多实例环境下有效。
常见误区
- 误区:认为四种算法只有名字不同。改正:说明是否允许突发、窗口精度、存储成本和满载后的行为,再按业务选型。
- 误区:只看长期平均速率。改正:检查窗口边界、桶容量、短时峰值和 P99,确认突发不会压垮下游。
- 误区:分布式计数不考虑时钟和网络延迟。改正:明确计数存储、原子更新、故障降级和多实例下的误差范围。