当前位置:首页 > 云谷精选

限流算法中的令牌桶和漏桶哪个更适合业务场景

admin2026年03月18日云谷精选42.18万
摘要:# 限流算法选哪个?聊聊令牌桶和漏桶的实战“手感” 搞过网站防护或者系统架构的朋友,对“限流”这个词肯定不陌生。服务器扛不住了、带宽快炸了,第一反应就是“得限个流”。但真到选方案的时候,面对“令牌桶”和“漏桶”这两位老将,很多人就懵了——**这俩听起来都…

限流算法选哪个?聊聊令牌桶和漏桶的实战“手感”

搞过网站防护或者系统架构的朋友,对“限流”这个词肯定不陌生。服务器扛不住了、带宽快炸了,第一反应就是“得限个流”。但真到选方案的时候,面对“令牌桶”和“漏桶”这两位老将,很多人就懵了——这俩听起来都挺有道理,到底该用哪个?

别急着翻教科书,咱们今天不聊那些复杂的数学公式,就说说我这些年调参、踩坑下来的真实感受。说白了,这俩算法的区别,有点像“弹性水龙头”和“固定漏斗”的区别。选哪个,真得看你业务是什么“脾气”。


先来个“人话版”解释:它俩到底在干啥?

我知道很多技术文章一上来就画图、列公式,看着就头疼。咱们换个方式。

想象一个网红奶茶店。

  • 漏桶算法:就像店里有个固定大小的漏斗(漏桶)。不管外面顾客(请求)多疯狂、多挤,点单员(系统)都必须把订单(请求处理)一杯一杯、匀速地通过漏斗漏下去给后厨。漏斗的出口速度是恒定的。哪怕一瞬间涌进来100个订单,后厨也只能按部就班地,比如每分钟处理10杯。超出的订单?要么在漏斗里排队(如果桶没满),要么就直接被拒绝(桶满了)。它的核心是:绝对均匀的输出,保护后厨(下游系统)不被冲垮。

  • 令牌桶算法:则像是一种“取号机”。后厨(系统)会以一个固定的速率生产“取餐牌”(令牌),放进一个桶里。顾客(请求)来了,必须先拿到一个“牌”,才能点单并被处理。如果一瞬间来了100个顾客,而桶里恰好攒了30个牌,那么前30个顾客能立刻拿到牌开始点单,后面的70个就得等新的牌生产出来。它的核心是:允许一定程度的突发流量,只要桶里有“存货”。

看出区别了吗?漏桶关心的是“出水的速度绝对平稳”,而令牌桶关心的是“进来的流量在总量上别太离谱,但偶尔爆一下可以接受”。


实战掰头:什么时候该选谁?

好了,理论太枯燥,咱们直接上场景。这也是我经常跟团队“吵架”(友好讨论)的地方。

场景一:保护“脆弱”的下游服务——请用漏桶

如果你的系统前面是个“暴脾气”的用户入口,后面连着一个“老心脏”的数据库或者某个第三方支付接口,漏桶是你的好朋友

我经历过一个坑:一个促销活动页,调用一个老旧的核心查询接口。一开始用了令牌桶,想着能应对开抢时的突发。结果呢?突发请求是过去了,那个老接口在并发稍微一高的时候,响应时间就会指数级增长,最后直接拖死。令牌桶放了“一群人”进去,反而成了压死骆驼的最后一根稻草。

后来换成漏桶,把流出速率严格限制在老旧接口能承受的并发以下。虽然前端排队时间变长了,用户得等,但系统整体再也没挂过。 这就是漏桶的价值:它用绝对的、平滑的输出,给你的核心脆弱系统穿上了防弹衣。 用户可能会抱怨“慢”,但绝不会看到“服务器错误500”。

说白了:当你需要的是一个“整流器”,把一切不规则的流量都熨烫平整时,选漏桶。 比如消息队列的消费者、写入数据库的速率控制。

场景二:兼顾体验与系统安全——请用令牌桶

现在大部分Web API、微服务网关,其实更常用令牌桶。为什么?因为业务需要“弹性”

想象一个API接口,平时每秒就几十个请求。突然有个大客户导数据,或者一个正常的运营活动开始,可能瞬间需要几百个请求。如果用漏桶,这些请求会被强行拉平成一条直线,体验极差。

但用令牌桶呢?只要你的“令牌桶”平时有积累(比如桶大小设置得合理),这波突发请求就能立刻消耗掉库存的令牌,快速得到响应。等桶里的令牌用完了,后续请求才会被平滑限制。这对用户来说,感觉就是“开始很快,后来稍微慢点”,体验上友好得多。

我自己在配高防IP或WAF的CC防护规则时,如果业务是面向真实用户的Web服务,首选也是基于令牌桶思想的策略。 因为它更符合人类访问的“波峰波谷”特性,不会因为一个正常的、短暂的访问高峰就把所有用户一棍子打死。

说白了:当你的业务允许、甚至需要短时间内“猛冲一下”,但又不想被持续攻击搞垮时,选令牌桶。 比如对外提供的API服务、网站的动态页面。


一些“踩坑”得来的私货心得

  1. 别神话算法,参数才是灵魂。 你给漏桶一个每秒10万流的出口速率,它也能“突发”。令牌桶的桶大小设为1,它也比漏桶还严格。选型只是第一步,真正的功夫在根据业务压测数据调整参数。 我见过太多人套了个默认参数就上生产,然后抱怨算法不好用。

  2. 组合拳往往更香。 在真实的大型系统里,尤其是金融、支付场景,经常是多层限流。比如:

    • 网关层用令牌桶,允许应用级别的突发,防止误伤正常用户。
    • 到了核心交易服务前,再用漏桶,确保每秒写入数据库的交易笔数绝对可控。
    • (这个组合很经典,能帮你挡掉大部分麻烦)
  3. “适合业务”比“算法先进”重要一万倍。 有些团队为了追求“技术范儿”,非要给一个内部后台管理系统上复杂的动态令牌桶。其实,一个简单的、固定速率的漏桶可能更稳定,运维成本也更低。技术是为人服务的,别搞反了。

  4. 没有“银弹”,监控和动态调整是关键。 上了限流不是就高枕无忧了。必须配好监控大盘,看限流触发的情况、排队队列的长度。业务量增长了,促销周期来了,参数该调就得调。限流策略应该是活的,不是配置完就扔那的石头。


所以,回到开头的问题

令牌桶和漏桶哪个更适合你的业务场景?

我的答案是:去看看你的业务流量曲线,去问问你的下游系统最怕什么。

  • 如果你的业务像平稳的溪流,偶尔有小浪花,下游又比较健壮——优先考虑令牌桶,让用户体验更好。
  • 如果你的业务像喜怒无常的山洪,而下游是座必须保护的老桥——果断用漏桶,把一切风险熨平。
  • 如果都很重要?那就别纠结,分层设计,混合使用

技术方案没有绝对的好坏,只有合不合适的场景。别听那些PPT里吹得天花乱坠的方案,真到了线上,能稳稳扛住流量、不误杀正常用户、还能让你晚上睡个安稳觉的,就是最适合你的好方案。

行了,关于限流,今天就聊这么多。参数怎么调?那又是另一个充满“惊喜”的故事了。

扫描二维码推送至手机访问。

版权声明:本文由www.ysyg.cn发布,如需转载请注明出处。

本文链接:http://www.ysyg.cn:80/?id=383

“限流算法中的令牌桶和漏桶哪个更适合业务场景” 的相关文章

CC脚本攻击:你以为的“小打小闹”,真能把网站拖到跪

# 标题:CC脚本攻击:你以为的“小打小闹”,真能把网站拖到跪 很多人一听到“DDoS攻击”,脑子里就是洪水滔天的流量,觉得那才是大场面。但真正让站长、运维头疼的,往往是另一种更“阴”的打法——**CC脚本攻击**。 它不用海量带宽,几个脚本小子,一台…

2017年那场CC攻击,为什么今天还在刺痛我们?

## 2017年那场CC攻击,为什么今天还在刺痛我们? 前几天跟一个老运维聊天,聊起网站防护那些事儿,他突然一拍大腿:“要说印象最深,还得是2017年那阵子,不知道哪冒出来一堆‘肉鸡’,专挑你登录接口怼,服务器CPU直接飙到100%,页面卡得跟PPT似的…

系统死锁:别让程序“卡”在黎明前

# 系统死锁:别让程序“卡”在黎明前 我前两天翻一个老项目的日志,半夜两点多突然停了,查了半天,最后发现是俩线程互相“等”上了——一个握着数据库连接不放,另一个占着文件锁不松手,结果谁也别想往下走。这场景你应该不陌生吧?这就是典型的死锁。 说白了,死锁…

Web3对现有互联网安全架构会带来什么冲击

# Web3来了,你的防火墙还够用吗? 说真的,每次看到“Web3将颠覆一切”这种标题,我就有点头疼。倒不是说Web3不好,而是太多人把这事儿说得太玄乎了,好像明天一觉醒来,互联网就彻底改头换面了。咱们搞安全的人,不能光跟着喊口号,得往实处想:**当数据…

解析高防CDN中的自动阈值调整算法:根据业务波峰实时动态加固

# 高防CDN的“智能开关”:自动阈值调整,真能扛住突袭吗? 我前两天刚翻过几个客户的防护日志,发现一个挺有意思的现象:很多站点,平时防护配置看着挺唬人,真遇到流量突袭的时候,该崩还是崩。问题出在哪儿?**很多时候,不是防护没开,而是“开关”太笨。**…

解析Anycast路由寻址算法在高防CDN近源清洗中的技术实现

# 当黑客的流量涌来,高防CDN靠什么“就近拦截”? 先说个我见过的真实场景。 去年帮一个做跨境电商的朋友处理过一次DDoS攻击,攻击流量不大,也就几十个G,但特别恶心——全是针对他们登录API的CC攻击。他们当时用的是一家知名云厂商的“基础版”高防,…