本文介绍 2 种常见的限流算法:漏桶算法、令牌桶算法
示意图:a 为漏桶算法,b 为令牌桶算法。
漏桶算法
漏桶算法的基本原理是,水(即 请求)从进水口流入漏桶,同时漏桶出水口以恒定的速率出水(对应请求放行);漏桶的容量是固定的,当漏桶被充满时,再入水就会溢出,即请求被拒绝。
细节如下:
- 水以任意速率流入桶中,即请求到来的速度是不确定的。
- 水以固定速率从桶中流出,即限制住了请求处理的速率为某一固定速率。
- 漏桶的容量是固定的,当入水的速度(请求到来的速度)大于 出水的速度(请求处理的速度),漏桶就会被充满,水就会溢出(请求被拒绝)。
优点:
- 可以保持稳定的流量输出速率,避免突发请求对系统造成过载。
- 实现较为简单
缺点:
- 漏桶的出水速率是固定的,对于突发流量的处理缺乏效率、灵活性(说明:即使有突发流量进来,请求处理的速率还是那么多,并没有动态地调整处理速率)
令牌桶算法
令牌桶算法的大致原理是,想象有一个存放令牌的桶,以固定的速度生成令牌并放入桶中;每次请求被处理,都会消耗一定数量的令牌;当桶中的令牌数量不足时,请求就会被拒绝。
细节说明:
- 桶的容量大小(即最多能够存放多少令牌)是固定的
- 生成令牌的速率,决定了请求处理的平均速率。如,每秒生成 2 个令牌,每个请求消耗 1 个令牌,那么请求处理的平均速率就是:2 / 1 = 2,即每秒处理 2 个请求。
- 令牌桶算法 能够处理短暂突发流量,短时间内较多请求进来,只要桶中有足够的令牌,那么这些请求就能够被处理。但是长期来看,请求处理的速率还是趋于设定好的平均速率(由放入令牌的速率决定)。
优点:
- 通过以固定的速度生成令牌,可以平稳地控制流量
- 可以应对短暂突发流量:令牌桶中可以预先生成并积累一定数量的令牌,从而可以应对短暂的突发请求
缺点:
- 对突发流量的适应性有限:令牌桶算法通过预先生成令牌来适应流量的突发情况,但是对于持续高强度的突发流量,令牌桶可能无法及时补充令牌,导致请求被拒绝。
- 实现较为复杂
如果有帮助的话,可以点个赞支持一下嘛
🙏