限流算法(漏桶/令牌桶)

限流算法

1.漏桶算法

算法需要的参数有两个:

  1. 漏桶的容量(容量固定,超过了容量就会溢出 —— 丢弃/等待
  2. 漏水的速率(即消耗流量的速度)

漏桶算法可以用于平滑网络上的突发流量(因为漏水的速率是恒定的)

通过Redis实现

  • Redis 4.0提供了一个限流模块,叫做redis-cell该模块使用了漏桶算法,同时提供了原子限流指令
  • 该模块只有一个指令,即cl.throttle
1
2
3
4
5
6
7
8
9
10
11
12
# cl.throttle keyName:reply capacity operations seconds quota
# keyName:键名
# capacity:漏桶容量
# operations/seconds:漏水速率
# quota:可选参数,默认1,水流量(申请的空间)

> cl.throttle books:reply 15 30 60 1
1) (integer) 0 # 0表示允许,1表示拒绝
2) (integer) 15 # 漏桶容量
3) (integer) 14 # 漏桶剩余空间
4) (integer) -1 # 如果拒绝了,需要多长时间后漏桶有空间
5) (integer) 2 # 多长时间后漏桶完全空出来

2.令牌桶算法

  1. 桶子用于装令牌(数量有上限
  2. 令牌会以一定的速率生成,并扔到桶中
  3. 每个请求进来,就去桶中拿一个令牌

限流算法 和 Semaphore 的区别

  1. Semaphore限制的是并发量,也即是说在Consumer端做限制,请求被阻塞在Consumer端,并不会降低整个链路的QPS,只会限制Consumer的消费能力
  2. 限流算法(漏桶算法/令牌环算法)限制的是QPS,影响的是全链路,也即是说请求会被阻塞在Producer端,Consuemr端消费能力决定了能通过的请求量

    你是否想起了“背压”
    感觉自己现在看待问题能够串联起来了(ง •_•)ง继续加油嗷~

-------------本文结束感谢您的阅读-------------

本文标题:限流算法(漏桶/令牌桶)

文章作者:DragonBaby308

发布时间:2019年10月25日 - 13:01

最后更新:2020年01月25日 - 13:03

原始链接:http://www.dragonbaby308.com/throttle/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

急事可以使用右下角的DaoVoice,我绑定了微信会立即回复,否则还是推荐Valine留言喔( ఠൠఠ )ノ
0%