【hyperf 源码分析】令牌桶限流器 - (sunznx) 振翅飞翔
31 March 2020

谈谈限流算法的几种实现
接口限流算法:漏桶算法&令牌桶算法 - 搜云库技术团队 - SegmentFault 思否

  1. 计数器算法
  2. 漏桶算法
  3. 令牌桶算法

漏桶和令牌桶的区别在于后者是可以存起来的。

在实现上,令牌桶生成的令牌并不是按字节算的,而是按 “次数”。比如,一个接口一秒内允许调用 x 次,而不是一个接口一秒内允许传送 n 个字节(按字节计算的很麻烦,也浪费 cpu)

在实现的时候,首先会在 “redis 或者其他存储引擎” 记录一个 key 值,这个值是一个 时间戳(microtime)。
假设我们设置了 1 秒钟允许调用 1 次这个接口。那么在开始调用 1 次接口的时候,会将 microtime+1000 然后和当前的时间戳判断

  1. 如果大,就说明超时了(这里还可以计算出超时多少秒,如果配置了允许超时等待,可以将这个超时时间返回,让调用方 sleep)
  2. 否则,说明可以正常执行(将 key 值更新为 microtime+1000