Generated by Answer me with HTML in Shimo Style 0.1.0 · 2026-10-19 16:23 · ★ Star on GitHub
限流放在网关,还是服务里
一个用 answer-me-with-html-in-Shimo-Style 生成的开箱示例
结论:入口限流放网关,业务限流放服务,两层各管一件事。
结论
两层各管一件事
网关按 IP 和租户挡住洪峰,服务按用户和接口保护自身。
请求路径
两种限流对比
| 位置 | 粒度 | 保护对象 | 失败时 |
|---|---|---|---|
| 网关 | IP / 租户 | 整个集群 | 返回 429 |
| 服务 | 用户 / 接口 | 单个实例 | 降级返回 |
| 两者都放 | 粗 + 细 | 集群与实例 | 分级处理 |
网关限流的开销
数据
| p50 | p95 | |
|---|---|---|
| 令牌桶 | 8us | 20us |
| 滑动窗口 | 12us | 35us |
| 固定窗口 | 3us | 6us |
令牌桶的最小实现
export function take(bucket: Bucket) { const now = Date.now(); bucket.tokens = Math.min( bucket.cap, bucket.tokens + ((now - bucket.at) / 1000) * bucket.rate ); bucket.at = now; if (bucket.tokens < 1) return false; bucket.tokens -= 1; return true;}注意
别把限流放到数据库前
数据库连接池耗尽时,限流已经来不及了。