60 秒回答模板

常见限流算法有四类。固定窗口是在一个时间窗口内计数,简单但窗口边界可能出现双倍突刺;滑动窗口按更细粒度或日志记录最近一段时间请求,边界更平滑但存储和计算成本更高;漏桶把请求按固定速率流出,能平滑流量但对突发不友好;令牌桶按固定速率生成令牌,请求拿到令牌才能通过,桶里可积累令牌,所以能限制平均速率并允许一定突发。生产中还要考虑单机还是分布式、集中式原子计数、网关限流、降级和熔断配合。

考点 固定窗口简单
难度 真实面经题
回答目标 讲清方法、取舍和追问

深入解析

01

固定窗口

固定窗口按分钟或秒计数,请求数超过阈值就拒绝。它实现简单,适合粗粒度保护,但在窗口切换前后可能短时间放行接近两倍阈值的请求。

02

滑动窗口

滑动窗口统计最近一段连续时间的请求,可以用请求日志、环形桶或加权计数实现。它比固定窗口更平滑,但需要更多存储、过期清理和并发控制。

03

漏桶算法

漏桶把请求放入桶中,系统按固定速率处理,桶满则丢弃或排队。它适合保护下游稳定处理能力,但突发流量会被削平,用户侧可能感到排队或拒绝。

04

令牌桶算法

令牌桶按固定速率补充令牌,请求消耗令牌。桶容量决定可承受的突发量,补充速率决定长期平均流量,因此常用于网关和接口 QPS 控制。

05

分布式实现

多实例服务要避免每台机器各自放大阈值。常见做法是网关集中限流、集中式原子计数、分片限流或本地预取令牌,同时监控热点 key 和限流误伤。

易错点

  • 不要只列算法名称,要说明突发能力、平滑能力和实现成本。
  • 不要忽略固定窗口的边界突刺,这是最常见追问。
  • 不要把限流等同于熔断或降级,它们目标和触发条件不同。
  • 不要在分布式场景只讲本地计数,阈值会被实例数放大。

面试官追问

令牌桶和漏桶最大的区别是什么?

漏桶强调固定速率流出,突发会被平滑;令牌桶允许令牌积累,所以能在平均速率受控的前提下放行短时突发。

分布式限流为什么不能只在本地内存做?

多实例下每台机器都有自己的计数器,总放行量会随实例数放大,除非做流量分片、集中限流或全局计数协调。

限流和熔断有什么区别?

限流是主动控制进入系统的流量,熔断是下游异常或超时后暂时停止调用,避免故障继续扩散。