Limit是长期平均速率token/秒Burst是桶容量最大token数二者需匹配Burst至少≥Limit动态调速须同时SetLimit和SetBurst限请求频次用rate限带宽用juju/ratelimitAllow()快速拒绝Reserve()预占Wait()阻塞等待并务必传超时contextIP限流需防map内存泄漏应加TTL或LRU清理。rate.Limiter 的 Limit 和 Burst 到底怎么设才不翻车直接说结论Limit 是长期平均速率单位token/秒Burst 是桶容量最大可攒多少 token两者必须配合理解不能只调大 Limit 就以为“立刻变快”。常见错误是这么干limiter.SetLimit(10) 后马上期望下一秒能 Allow() 10 次——但实际可能只成功 5 次。原因在于桶里 token 不是瞬间补满的它依赖 advance() 函数按时间推算而初始 token 数 上次剩余 Limit × 经过时间。如果刚从 5 QPS 切到 10 QPS但距离上次调用还不到 1 秒最多只多出不到 10 个 token且受 Burst 上限压制。Burst 至少要 ≥ Limit否则新速率永远达不到比如 Limit10 但 Burst5桶最多存 5 个 token再快也白搭想支持突发流量Burst 可设为 Limit × 2 或更高如 10 QPS 配 Burst20动态调速时应同时调 SetLimit() 和 SetBurst()否则新 Limit 被旧 Burst 卡住上传/下载限速该用 rate 还是 juju/ratelimit标准库 golang.org/x/time/rate 专为“请求频次”设计单位次/秒不适合字节级流控而 github.com/juju/ratelimit 是为“数据吞吐”量身定制的单位字节/秒二者定位不同混用会出问题。比如你用 rate.NewLimiter(1*1024*1024, 1*1024*1024) 去限上传流——它根本不知道“1MB”是字节数只会当“1048576 次请求”结果一读就失败或行为错乱。立即学习“go语言免费学习笔记深入”限 HTTP 请求频率如每 IP 每秒最多 5 次→ 用 rate.Limiter限文件上传/下载带宽如限制上传速度 ≤ 1MB/s→ 用 ratelimit.NewBucketWithRate(fillRate, capacity)fillRate 设成目标速率如 1 * 1024 * 1024capacity 建议 ≥ fillRate避免首包就被卡Allow()、Reserve()、Wait() 三个方法怎么选它们本质都是消费 token但对“失败”的处理逻辑完全不同选错会导致阻塞、超时或误拒。 Trenz AI驱动的社交电商营销平台专为TikTok Shop设计