背景
对外开放的 LLM API 网关需要精准控制每个调用方的 token 用量。简单的时间窗口计数不够,需要:多级配额(按 API / 应用 / 模型)、多时间周期(日/月/年/自定义时长)、高性能低延迟。
这个模块就是为此设计,运行在 OpenResty 中,用 Redis + Lua 脚本实现原子化的配额检查和扣减。
核心设计
三级限流模型
1 | API 级别配额 |
查询优先级:Model 覆盖 > APP 覆盖 > API 默认 > 无限制
双路径结算
用量累计分两条路径,在安全期和危险期之间自动切换:
| 阶段 | 剩余配额 | 结算方式 | 延迟 |
|---|---|---|---|
| 安全期 | > 阈值 | 写入 shared dict 缓冲区,每秒批量 flush 到 Redis | 0-1000ms |
| 危险期 | ≤ 阈值 | 每次请求实时写 Redis | 实时 |
切换条件:预扣后剩余量 ≤ (时间窗口总配额 × 10%) 时进入危险期。
数据流
1 | 请求进入 |
时间周期支持
- 自然周期:日、月、年
- ISO 8601 自定义时长:
P45D(45天)、P3M(3个月)、P2Y(2年) - 自定义周期元数据持久化到 MySQL
模块结构
1 | lua/token_quota/ |
Redis 数据结构
1 | # 额度配置 |
测试
29 个端到端测试用例覆盖 11 个场景:
1 | ./test.sh # 基础功能测试 |
测试场景包括:首次请求、配额耗尽、危险期切换、多级配额覆盖、自定义周期、API key 不存在等。