限流是防止滥用的第一道防线。聊聊如何封装一个通用的 Rate Limiting 方案。
为什么需要 Rate Limiting
没有限流的 SaaS 是脆弱的:
- 注册接口可以被脚本暴力注册
- 登录接口可以被撞库
- 邮件发送接口可以被滥用
RuiTool AI 在所有敏感操作上都加了限流。
底层:KV 实现滑动窗口
| |
核心设计:
- 滑动窗口:用
Math.floor(now / windowInSeconds)做时间窗口分组 - KV 自动过期:
expirationTtl让窗口自动清理 - 返回
reset时间:前端可以告诉用户"请 X 分钟后重试"
封装层:withRateLimit
| |
RateLimitError 包含 retryAfterSeconds,前端可以展示剩余等待时间。
预定义限流配置
| |
每个业务场景有独立的限流配置,互不影响。
IPv6 归一化
IPv6 地址一个用户可能有多个(因为隐私扩展),直接用原始 IP 做限流 key 会导致绕过。解决方法是无视后 64 位:
| |
总结
- 基于 KV 的滑动窗口限流,无需额外基础设施
withRateLimit封装统一入口,调用方只需传配置- 每个业务场景独立限流,互不影响
- IPv6 归一化防止绕过
- 开发/测试环境自动跳过,不干扰日常开发
