Azure Resource SWE · VO Coding with scale followup

Microsoft Azure 100K QPS 限流器:令牌桶、分片与一致性取舍

从单键令牌桶出发,分析 100K QPS 聚合流量下的全局配额、突发容忍、原子更新和故障降级。

题目重点:从单键令牌桶出发,分析 100K QPS 聚合流量下的全局配额、突发容忍、原子更新和故障降级。

题意与假设

这道练习题保留了面经中值得训练的核心约束,并将需要澄清的条件单独列出。现场拿到变体时,先和面试官确认这些条件。

  • 训练版按 tenant+API 维度每秒平均 r 个请求、允许容量 b 的瞬时突发,使用 token bucket;r、b 由产品配置,非题目数值。
  • 100K QPS 先按所有 key 的总峰值设计;如果单个 tenant/key 就有 100K QPS,单 key 全局精确判定会形成串行热点,需另谈误差或集中瓶颈。
  • 超限返回 429 与 Retry-After 之类信号,但实际 API 协议和是否允许 fail-open 必须业务确定。

解题路线

  1. 单 key 令牌桶状态为 (tokens,lastRefill),到 t 时设 tokens=min(b,tokens+r·max(0,t−lastRefill)),若 ≥1 则减 1 并放行;时间要单调且同键更新原子。
  2. 入口先验证租户身份并选 key;不同 key 用稳定哈希分片到多个 limiter shard,网关本地可批量申请小额令牌 lease 以降低远程往返,但 lease 总和必须从全局桶原子扣除。
  3. 若要求严格全局不超配,所有同 key 的消耗最终需串行化到一个一致性域,热点可能限制吞吐;若允许有界超额,可给每个网关预分配额度并设租期/上限,故障时回收/过期处理。
  4. 对突发拒绝、队列等待与并发上限分别治理:令牌桶限速不等于限制在途请求,后端还需要容量保护。配置版本变更、时钟倒退、重复网关重试和 lease 失效都要有确定规则。
  5. 容量估算区分总请求率、key 基数、最热 key 占比与读写峰值;监控拒绝率、热键、令牌租借误差、延迟和后端饱和,压力测试跨 shard 和区域故障。

手动走一遍

r=10/s、b=20,空闲后桶至多积累 20 个令牌;同一瞬间来 25 个请求,最多 20 个放行。若两个网关各离线持有 10 枚已从全局扣出的 lease,合计仍受 20 控制;若各自独立造 20 枚,则全局可能放行 40。100K QPS 是否仅总量决定这类分片是否有效。

规模与取舍

单 key 判定 O(1) 时间/状态;K 个活跃 key 状态 O(K)。总流量 100K QPS 可按 key 分摊到 S shard,平均约 100K/S,但热点 key 不随 S 自动消失。跨区强一致额度会增 RTT,选择需依据实际 SLA。

易错点与追问

容易失分的边界

  • 把 100K QPS 当所有请求都打一个 key,或反过来假设热点不存在。
  • 每个网关各存一份完整全局配额,合计超配。
  • 用普通读改写桶状态,并发下丢更新。
  • 只有限速没有并发保护,慢请求仍压垮后端。
  • 时钟倒退使令牌计算出负时间。

继续深挖

  • 硬全局限额与低延迟多地域请求冲突时怎样做产品取舍?
  • 热点租户单 key 100K QPS 时可接受多少超额?
  • 配置从 r=10 降到 r=2 时旧 lease 怎样处理?
  • Redis/协调服务故障时选择 fail-open 还是 fail-closed?
✓已复制微信号!