漏洞的容量是有限的,如果将漏嘴堵住,然后一直往里面灌水,它就会变满,直至再也装不进去。如果将漏嘴放开,水就会往下流,流走一部分之后,就又可以继续往里面灌水。如果漏嘴流水的速率大于灌水的速率,那么漏斗永远都装不满。如果漏嘴流水速率小于灌水的速率,那么一旦漏斗满了,灌水就需要暂停并等待漏斗腾空。 所以,漏斗的剩余空间就代表着当前行为可以持续进行的数量,漏嘴的流水速率代表着系统允许该行为的最大频率。
模块 redis-cell 可以用来实现漏斗算法限流,使用的指令为cl.throttle
> cl.throttle laoqian:reply 15 30 60
(integer) 0 # 0 表示允许,1表示拒绝
(integer) 15 # 漏⽃容量capacity
(integer) 14 # 漏⽃剩余空间left_quota
(integer) -1 # 如果拒绝了,需要多⻓时间后再试(漏⽃ 有空间了,单位秒)
(integer) 2 # 多⻓时间后,漏⽃完全空出来 (left_quota==capacity,单位秒)
如果请求被拒绝,那么 redis-cell 将会取返回的第四个值作为等待时间去进行重试。