新闻详情

新闻详情

首页 / 资讯中心 / 详情

Go 限流方案:令牌桶 / 滑动窗口 / 自适应限流全解

发布时间:2026/10/2 16:06:48来源:尧图网络
Go 限流方案:令牌桶 / 滑动窗口 / 自适应限流全解
Go 限流方案令牌桶 / 滑动窗口 / 自适应限流全解高并发服务必须有限流。三种常见算法对比看懂场景再选。一、令牌桶经典而稳定importgolang.org/x/time/ratelimiter:rate.NewLimiter(10,20)// 速率10/s桶容量20if!limiter.Allow(){returnerrors.New(429 too many requests)}原理每秒发 10 个令牌到桶中桶满 20请求要拿令牌。适合突发流量可以容忍的场景例如网关 QPS 控制。二、滑动窗口精确但消耗内存typeSlidingWindowstruct{mu sync.Mutex limitintwindow time.Duration requests[]time.Time}func(s*SlidingWindow)Allow()bool{s.mu.Lock()defers.mu.Unlock()now:time.Now()cutoff:now.Add(-s.window)i:0forilen(s.requests)s.requests[i].Before(cutoff){i}s.requestss.requests[i:]iflen(s.requests)s.limit{returnfalse}s.requestsappend(s.requests,now)returntrue}适合风控、秒杀场景需要 60 秒内不超过 1000 次的精确约束。三、计数器实现简单但窗口边界突兀typeFixedWindowstruct{mu sync.Mutex cntinttsint64limitint}func(s*FixedWindow)Allow()bool{s.mu.Lock()defers.mu.Unlock()now:time.Now().Unix()ifnow!s.ts{s.cnt0s.tsnow}ifs.cnts.limit{returnfalse}s.cntreturntrue}缺点每分钟切点可能突发 2 倍请求如11:59:59、12:00:01。四、漏桶平滑限流适合QQ 长连接强制输出速率。importgithub.com/juju/ratelimitb:ratelimit.NewBucket(1*time.Second,100)// 1 秒填一次一次填 100 个五、Adaptive 自适应限流// 监控延迟、CPU、错误率ifcpuUsage90%{limiter.SetLimit(limiter.Limit()*0.8)}自适应按当前指标动态调整避免挂掉-限流-恢复-再限流的震荡。六、实战HTTP 限流中间件importgolang.org/x/time/ratefuncRateLimitMiddleware(limiter*rate.Limiter)gin.HandlerFunc{returnfunc(c*gin.Context){if!limiter.Allow(){c.JSON(429,gin.H{code:RATE_LIMIT})c.Abort()return}c.Next()}}按 IP 分桶limiters:sync.Map{}varraterate.Limit(1)funclimiterForIP(ipstring)*rate.Limiter{l,ok:limiters.Load(ip)ifok{returnl.(*rate.Limiter)}n:rate.NewLimiter(rate,5)limiters.Store(ip,n)returnn}七、限流 熔断 降级服务级别限流在前、熔断在后、降级在最末。工具功能golang.org/x/time/rate限流sony/gobreaker熔断ioa/kratos/middleware三合一八、踩坑清单跨实例限流进程内 token bucket 不是集群限流需 Redis Lua令牌突增突发量大时建议加上 Cost按请求消耗Allow() 不能 sleep 阻塞需要的话用 Wait / Reserve九、集群限流Redis LualocalkeyKEYS[1]locallimittonumber(ARGV[1])localcurrenttonumber(redis.call(incr,key))ifcurrent1thenredis.call(expire,key,ARGV[2])endifcurrentlimitthenreturn0endreturn1Go 端调用 Lua, atomic。十、总结与展望本地限流用rate.Limiter精确控制用滑动窗口集群层用 Redis Lua 或 Sentinel自适用调优是高级用。未来AIOP 平台将限流纳入 telemetry自动调优窗口与阈值。十一、参考文献rate 包文档阿里 SentinelCloudflare 限流博客
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Git多人协作从入门到实战:分支管理、冲突解决与SSH认证排查 2026/10/2 16:53:04

Git多人协作从入门到实战:分支管理、冲突解决与SSH认证排查

1. 从单打独斗到团队作战:Git协作模型的核心转变先说个我自己的经历。早年间我写代码基本是单兵作战,Git对我来说就是个带撤销功能的网盘,来回就add、commit、push三连,偶尔checkout回滚一下,日子过得相当舒坦。直到第…

阅读更多 →
k9s v0.25.7 维护版解析:修复容器彩色日志显示背后的 ANSI 与日志管线 2026/10/2 16:53:04

k9s v0.25.7 维护版解析:修复容器彩色日志显示背后的 ANSI 与日志管线

云原生容器编排CLI运维 【免费下载链接】k9s 🐶 Kubernetes CLI To Manage Your Clusters In Style! 项目地址: https://gitcode.com/GitHub_Trending/k9s/k9s 点击查看 免费下载 导读 k9s v0.25.7 是一个聚焦问题修复的维护版本(Maintenan…

阅读更多 →
嵌入式实战:从代码烧录到硬件现象的确定性闭环 2026/10/2 16:52:57

嵌入式实战:从代码烧录到硬件现象的确定性闭环

1. 这不是“教嵌入式”,而是带人亲手把代码烧进芯片里很多人一看到“嵌入式教学”四个字,脑子里立刻浮现出:PPT翻页、寄存器地址表截图、GPIO配置流程图、还有那句万年不变的开场白——“嵌入式系统是软硬结合的典型代表”。我干这行十一年&a…

阅读更多 →
Spring Boot + Cursor 实战:从零到一搭建一个生产级用户中心(TaoToken 统一 Key 接入篇) 2026/10/2 16:52:57

Spring Boot + Cursor 实战:从零到一搭建一个生产级用户中心(TaoToken 统一 Key 接入篇)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Cursor+Apifox MCP:AI驱动接口自动化测试实战指南 2026/10/2 16:52:56

Cursor+Apifox MCP:AI驱动接口自动化测试实战指南

最近一段时间,我把接口自动化测试的大部分生成工作从“手写”换成了“让 AI 先写、我再改”,核心工具就是Cursor Apifox MCP Server。刚开始我也以为这种组合只是把接口文档丢给 AI 而已,真正用下来才发现,整个过程比我想象的顺畅…

阅读更多 →
人工智能重塑智能家居:从遥控到无感联动的技术实践 2026/10/2 16:52:55

人工智能重塑智能家居:从遥控到无感联动的技术实践

你有没有发现,这两年智能家居的产品发布话术悄悄变了。前几年还在拼“远程开关灯”“APP控制空调”,这两年主流词已经变成“AI主动调节”“全屋无感联动”。人工智能和智能家居这两个关键词,正在从尝鲜工具转变成日常帮手,普通人家…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉