Go语言如何做速率限制_Go语言rate limiter教程【速学】
Limit是长期平均速率(token/秒),Burst是桶容量(最大token数),二者需匹配:Burst至少≥Limit,动态调速须同时SetLimit和SetBurst;限请求频次用rate,限带宽用juju/ratelimit;Allow()快速拒绝,Reserve()预占,Wait()阻塞等待并务必传超时context;IP限流需防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,否则新速率永远达不到(比如 Limit=10 但 Burst=5,桶最多存 5 个 token,再快也白搭)想支持突发流量,Burst 可设为 Limit × 2 或更高(如 10 QPS 配 Burst=20)动态调速时,应同时调 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 * 1024),capacity 建议 ≥ fillRate,避免首包就被卡Allow()、Reserve()、Wait() 三个方法怎么选它们本质都是消费 token,但对“失败”的处理逻辑完全不同,选错会导致阻塞、超时或误拒。 Trenz AI驱动的社交电商营销平台,专为TikTok Shop设计
