V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
badboy17
V2EX  ›  Java

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

  •  
  •   badboy17 · 2022-09-15 19:20:40 +08:00 · 2475 次点击
    这是一个创建于 830 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    8 条回复    2022-09-23 17:18:06 +08:00
    chevalier
        1
    chevalier  
       2022-09-15 19:29:33 +08:00
    漏桶是匀速处理请求的,突发请求可以进桶(相当于进了一个队列)但是并不会立即处理,还是按照原来的速度一个个匀速处理
    gaodq
        2
    gaodq  
       2022-09-15 23:00:53 +08:00   ❤️ 1
    可以搜一下 golang time/rate 包的实现文章
    zmal
        3
    zmal  
       2022-09-15 23:54:45 +08:00
    漏桶就是一个定长队列,入队列时无限制可以猛入,下游慢慢消费。请求峰值时队列写满,后续请求被丢弃,表现为服务不可用。
    令牌桶也有最大容量,可以理解为每秒增加 m 个直到达到桶的最大值 n 。和漏桶的区别主要是两点: 1.即使桶未满,qps 超过令牌入桶流速时部分丢弃,表现为服务限流,达到了类似滑动窗口的限流功能。2.桶的最大值起到一个蓄水池效果,和漏桶一个意思。
    xuanbg
        4
    xuanbg  
       2022-09-16 09:10:54 +08:00   ❤️ 1
    漏桶这个名字真是最贴切不过了。一个漏水的桶,只要有注水(进数据)就会不断漏出(处理数据),但桶被水注满(最大缓冲数据)了,就会溢出(被限流的数据)。
    令牌桶其实也好理解,就是一个桶里面装满了令牌,你拿到令牌就可以处理数据,系统会以固定的速率往桶里面装新的令牌,保证桶里总有令牌可以让你拿。当然,装满了就不会再往里装。正常情况下桶里总有令牌可以拿,但大伙一拥而上的时候,桶里的令牌就会被抢个精光,在没有新的令牌放进桶里之前,你就木得令牌可拿了,就被限流了。
    badboy17
        5
    badboy17  
    OP
       2022-09-16 20:17:02 +08:00
    这个文章挺好的,分享给大家,用 go 实现了漏桶算法 https://zhuanlan.zhihu.com/p/441005648
    leonme
        6
    leonme  
       2022-09-17 22:01:46 +08:00
    "令牌桶可以允许突然的并发流量,但是漏桶不行"
    -----------------------------------------------------------
    没太理解这句话?
    badboy17
        7
    badboy17  
    OP
       2022-09-18 10:33:12 +08:00
    @leonme 令牌桶允许一段时间得突发流量,也就是令牌缓存得比较多得时候,允许超过限流得流量,但是漏桶强行的限定了水流出的速率
    CantSee
        8
    CantSee  
       2022-09-23 17:18:06 +08:00
    令牌桶可以解决突刺的情况,漏洞一定是匀速的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5162 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 05:43 · PVG 13:43 · LAX 21:43 · JFK 00:43
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.