limit 和 burst 必须协同配置:limit 表示每秒平均令牌数,burst 为桶容量且必须 ≥ limit;推荐 burst = limit × 2~3 以应对脉冲流量,避免 burst
rate.Limiter 的 Limit 和 Burst 怎么配才不翻车
配错
Limit和Burst是上线即崩的高频原因。二者不是独立参数,必须协同:Limit是每秒平均令牌数(比如rate.Limit(50)表示 50 QPS),Burst是桶最大容量(单位:个)。
Burst必须 ≥Limit,否则桶永远装不满,新速率根本达不到——例如设了Limit=10却只给Burst=5,那最多同时放行 5 次,再快也白搭- 想扛住短时脉冲(比如前端重试、并发请求),
Burst建议设为Limit × 2~× 3(如 50 QPS 配Burst=100)- 纯匀速调用(如定时任务轮询),可设
Burst == Limit,但生产环境极少真匀速,不推荐- 别写
rate.Every(time.Second / 10)——Go 编译器可能优化掉除法,直接用rate.Limit(10)按接口路径隔离限流器,而不是全局共用一个
把同一个
*rate.Limiter实例硬套在所有 handler 上,等于所有接口共享一桶,/health和/pay被同等限流,健康检查失败会触发雪崩。
- 用
sync.Map缓存不同路径对应的限流器,key 推荐用标准化后的路由路径,比如"POST:/api/order/create"或正则匹配后的路由名(如"order-create")- 避免直接用
r.URL.Path当 key——带查询参数或 ID 的路径(如/user/123)会导致 key 泛滥,应提取模板路径(如/user/{id})- 对
GET /health、GET /metrics这类探活/监控接口,必须显式跳过限流,加白名单判断- 初始化时预热常用路径的限流器,别等第一个请求才
LoadOrStore,否则首请求延迟高HTTP 中间件里该用 Allow() 还是 Wait()?
三者都消费 token,但语义和行为完全不同,选错直接卡死 goroutine 或误拒合法请求。
Alibabacloud Sdk Client Initialization For Golang下载初始化并管理阿里云SDK Go 客户端,涵盖 sync.Once 单例、goroutine 安全、endpoint 与 region 配置、VPC 端点及调试。
Allow():非阻塞判断,返回true才放行。适合网关层快速拒绝,配合429状态码,不等令牌Wait(ctx):阻塞直到拿到令牌或 ctx 超时。必须传带超时的子 context(如context.WithTimeout(r.Context(), 200*time.Millisecond)),否则客户端断连后 goroutine 泄漏Reserve()或ReserveN():预占令牌,能精确算剩余配额(用于填X-RateLimit-Remaining头),失败后需手动reserve.Cancel(),否则 token 白扣- 别在中间件里裸调
Wait(context.Background())——背景 context 永不超时,等于永久挂起响应头怎么写才算“标准”且可用
只返回
429 Too Many Requests不够,下游和服务治理系统需要可解析的限流元数据。
- 必须返回三个标准头:
X-RateLimit-Limit(总配额)、X-RateLimit-Remaining(剩余)、X-RateLimit-Reset(重置时间戳)X-RateLimit-Remaining不能靠减法硬算(burst - used),并发下不准;要用limiter.ReserveN(time.Now(), 1)预占再查reserve.Delay()和reserve.OK状态X-RateLimit-Reset别手算time.Now().Add(time.Second / limiter.Limit()).Unix()——limiter.Limit()返回 float64,除法精度误差会导致重置时间漂移,建议用time.Now().Add(time.Second).Truncate(time.Second).Unix()粗粒度对齐- 所有头值必须是整数字符串,不要带小数点或科学计数法,否则前端或监控工具解析失败
真正难的不是写几行
rate.NewLimiter,而是让每个路径的限流器生命周期可控、key 提取不污染、响应头不被忽略、突发流量有缓冲但又不击穿下游——这些细节没压到线上,永远不知道哪一行配置会成为压垮服务的最后一根稻草。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!












