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