之前有疑问,令牌桶可以允许突然的并发流量,但是漏桶不行,然后看了一些资料,也是云里雾里,感觉并没有理解透彻,后来看 guava 的 ratelimiter ,用的令牌桶算法,代码里其实并没有维护一个’桶‘的概念,现在比较好奇,怎么实现一个漏桶算法呢,用代码,或者伪代码,有大佬有相关的资料吗
1
chevalier 2022 年 9 月 15 日
漏桶是匀速处理请求的,突发请求可以进桶(相当于进了一个队列)但是并不会立即处理,还是按照原来的速度一个个匀速处理
|
2
gaodq 2022 年 9 月 15 日 可以搜一下 golang time/rate 包的实现文章
|
3
zmal 2022 年 9 月 15 日
漏桶就是一个定长队列,入队列时无限制可以猛入,下游慢慢消费。请求峰值时队列写满,后续请求被丢弃,表现为服务不可用。
令牌桶也有最大容量,可以理解为每秒增加 m 个直到达到桶的最大值 n 。和漏桶的区别主要是两点: 1.即使桶未满,qps 超过令牌入桶流速时部分丢弃,表现为服务限流,达到了类似滑动窗口的限流功能。2.桶的最大值起到一个蓄水池效果,和漏桶一个意思。 |
4
xuanbg 2022 年 9 月 16 日 漏桶这个名字真是最贴切不过了。一个漏水的桶,只要有注水(进数据)就会不断漏出(处理数据),但桶被水注满(最大缓冲数据)了,就会溢出(被限流的数据)。
令牌桶其实也好理解,就是一个桶里面装满了令牌,你拿到令牌就可以处理数据,系统会以固定的速率往桶里面装新的令牌,保证桶里总有令牌可以让你拿。当然,装满了就不会再往里装。正常情况下桶里总有令牌可以拿,但大伙一拥而上的时候,桶里的令牌就会被抢个精光,在没有新的令牌放进桶里之前,你就木得令牌可拿了,就被限流了。 |
5
badboy17 OP 这个文章挺好的,分享给大家,用 go 实现了漏桶算法 https://zhuanlan.zhihu.com/p/441005648
|
6
leon0318 2022 年 9 月 17 日
"令牌桶可以允许突然的并发流量,但是漏桶不行"
----------------------------------------------------------- 没太理解这句话? |
8
CantSee 2022 年 9 月 23 日
令牌桶可以解决突刺的情况,漏洞一定是匀速的
|