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 生成的开箱示例

source示例 · answer-me-with-html-in-Shimo-Style

结论:入口限流放网关,业务限流放服务,两层各管一件事。

A

结论

两层各管一件事

网关按 IP 和租户挡住洪峰,服务按用户和接口保护自身。

B

请求路径

requestcheck quotaallowforwardcheck userallowClientGatewayLimiterServiceServiceLimiter
C

两种限流对比

位置 粒度 保护对象 失败时
网关 IP / 租户 整个集群 返回 429
服务 用户 / 接口 单个实例 降级返回
两者都放 粗 + 细 集群与实例 分级处理
D

网关限流的开销

p50p950us5us10us15us20us25us30us35us8us20us令牌桶12us35us滑动窗口3us6us固定窗口
数据
p50p95
令牌桶8us20us
滑动窗口12us35us
固定窗口3us6us
E

令牌桶的最小实现

limiter.ts · sketchts
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;}
F

注意

别把限流放到数据库前

数据库连接池耗尽时,限流已经来不及了。