1 缘起
系统需要对某些功能做限流,因为,这个功能CPU消耗远高于其他功能,最高可占用100%分配的CPU,导致整个系统无法对外提供服务。
为了保证系统稳定运行,以及缓解CPU高消耗,对这些高CPU消耗的功能做限流处理,
而限流方案有多种:计数器算法、滑动窗口算法、漏桶算法和令牌桶算法。
最终,选择令牌桶算法,保证系统平滑限流。
另,为提升限流操作稳定性,使用LUA脚本包装令牌桶数据变更操作,
这样做,虽然保证了多个限流任务间的原子性操作,但是,无法保证LUA脚本的多步骤原子性。
不过,够用。
2 理论
限流器有多种实现方案,本次分享令牌桶限流器。
令牌桶限流器示意图如下图所示。由图可知,令牌桶限流器运转有两个过程,
(1)用户使用系统时,系统从令牌桶中获取令牌,根据令牌桶中令牌数量是否满足当前请求的令牌数量,即令牌桶剩余令牌数量>=当前请求的令牌数量时,可以获取到令牌,否则,无法获取令牌,判断是否进入下一个流程;