中文 EN

系统设计 Lab

Rate limiter 设计本质是一个对 latency 敏感的 atomic state 问题。

调节请求量、quota、burst 容忍度、key cardinality、hot-key 倾斜、region 数量和 latency 目标。架构会从本地 counter 逐步演进到 Redis/Lua、sharded state、本地 pre-check,当全局正确性变得重要时再加上一个 quota service。

分步讲解

一步一步把它想清楚

常规演进场景

从左到右点击,就是预设的演示路径。每张卡片都会改变 workload 输入。

Workload

这些是输入,不是预设好的架构阶段。

推荐形态

当前架构路径
Rate limiter 架构图 白板风格的架构图,展示同步的 rate-limit enforcement、本地 pre-check、Redis Lua state、sharding、quota service、转发到 backend,以及 analytics event。 Client Edge / API Limiter state 协调 Service + analytics Client 请求 burst API gateway 在 app 之前 enforce Local check 廉价预过滤 Redis Lua atomic state 更新 Shard router key -> state shard Quota service 全局预算 Backend 只放行允许的流量 Events 滥用 + 调优
Client
Client 发出必须得到同步 allow 或 deny 的流量
Edge / API
API gateway 在调用 backend 之前执行 enforcement
Local pre-check 对低风险或已缓存 state 的快速进程内检查
Limiter state
Redis Lua 为分布式 server 提供 atomic 的 check-and-update
Shard router 分散 key state 并隔离 hot key
协调
Quota service 协调严格全局或各 region 的预算
Service + analytics
Backend 只接收允许的流量
Events 记录判定结果,供滥用分析和调优

瓶颈

Atomic 路径负载

Hot-key 压力

State 内存

跨 region 正确性

Latency 预算

为什么会变

    决策权衡

    Limiter 算法

    本地内存

    Redis + Lua

    State sharding

    全局 quota

    Fail 模式

    有出处支撑的规则

    这些是模型背后那些经得起时间考验的 system design 论断。而 slider 的具体阈值,则被刻意标注为教学用的假设。

    已验证的规则

    atomic 自增加上过期是最简单的 rate-limiter 基线

    Redis 文档用 INCR 和 key 过期描述了基于 counter 的 rate limiter 模式,正好对应单窗口的基线。

    Redis Docs
    已验证的规则

    Lua 脚本让 check-and-update 在单个 Redis shard 上 atomic

    当很多 API server 在竞争时,limiter 不应该把读、算、写做成各自独立的网络操作。

    Redis Docs
    已验证的规则

    生产环境的 rate limiting 通常在 origin 之前执行

    edge enforcement 在花费 origin 资源之前就判定请求能否继续,从而保护 backend。

    Cloudflare Docs
    已验证的规则

    分布式 rate limiting 有明确的 local 对 global 权衡

    global rate limiting 把判定集中起来,而 local 检查更快,但跨多 instance 或多 region 时不够精确。

    Envoy Docs

    教学用假设

    • 这个 lab 建模的是同步 enforcement 路径;Kafka 风格的 event stream 用于 analytics、滥用调查和调优。
    • Hot-key 阈值刻意保守,因为即使总 QPS 看起来安全,一个滥用 key 也可能主导一个 shard。
    • 跨 region 的严格全局 quota 被建模成一种正确性选择,它会花掉 latency 和可用性预算。