关于限流组件,令牌桶和漏桶

2022-09-15 19:20:40 +08:00
 badboy17

之前有疑问,令牌桶可以允许突然的并发流量,但是漏桶不行,然后看了一些资料,也是云里雾里,感觉并没有理解透彻,后来看 guava 的 ratelimiter ,用的令牌桶算法,代码里其实并没有维护一个’桶‘的概念,现在比较好奇,怎么实现一个漏桶算法呢,用代码,或者伪代码,有大佬有相关的资料吗

2388 次点击
所在节点    Java
8 条回复
chevalier
2022-09-15 19:29:33 +08:00
漏桶是匀速处理请求的,突发请求可以进桶(相当于进了一个队列)但是并不会立即处理,还是按照原来的速度一个个匀速处理
gaodq
2022-09-15 23:00:53 +08:00
可以搜一下 golang time/rate 包的实现文章
zmal
2022-09-15 23:54:45 +08:00
漏桶就是一个定长队列,入队列时无限制可以猛入,下游慢慢消费。请求峰值时队列写满,后续请求被丢弃,表现为服务不可用。
令牌桶也有最大容量,可以理解为每秒增加 m 个直到达到桶的最大值 n 。和漏桶的区别主要是两点: 1.即使桶未满,qps 超过令牌入桶流速时部分丢弃,表现为服务限流,达到了类似滑动窗口的限流功能。2.桶的最大值起到一个蓄水池效果,和漏桶一个意思。
xuanbg
2022-09-16 09:10:54 +08:00
漏桶这个名字真是最贴切不过了。一个漏水的桶,只要有注水(进数据)就会不断漏出(处理数据),但桶被水注满(最大缓冲数据)了,就会溢出(被限流的数据)。
令牌桶其实也好理解,就是一个桶里面装满了令牌,你拿到令牌就可以处理数据,系统会以固定的速率往桶里面装新的令牌,保证桶里总有令牌可以让你拿。当然,装满了就不会再往里装。正常情况下桶里总有令牌可以拿,但大伙一拥而上的时候,桶里的令牌就会被抢个精光,在没有新的令牌放进桶里之前,你就木得令牌可拿了,就被限流了。
badboy17
2022-09-16 20:17:02 +08:00
这个文章挺好的,分享给大家,用 go 实现了漏桶算法 https://zhuanlan.zhihu.com/p/441005648
leonme
2022-09-17 22:01:46 +08:00
"令牌桶可以允许突然的并发流量,但是漏桶不行"
-----------------------------------------------------------
没太理解这句话?
badboy17
2022-09-18 10:33:12 +08:00
@leonme 令牌桶允许一段时间得突发流量,也就是令牌缓存得比较多得时候,允许超过限流得流量,但是漏桶强行的限定了水流出的速率
CantSee
2022-09-23 17:18:06 +08:00
令牌桶可以解决突刺的情况,漏洞一定是匀速的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/880347

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX