限流算法
1. 令牌桶(Token bucket)
令牌桶(Token bucket)算法广泛用于速率限制。 它简单易懂,常被互联网公司采用。 Amazon [5] 和 Stripe [6] 都使用这个算法来限制他们的 API 请求。
令牌桶算法的工作原理如下:
- 令牌桶是一个具有预定义容量的容器。 令牌会以预定的速率定期放入桶中, 一旦桶满了,就不再添加令牌。 如图4-4所示,令牌桶容量为4,注入装置每秒向桶中放入2个令牌,一旦桶满了,多余的令牌就会溢出。
每个请求都会消耗一个令牌。当一个请求到达时,我们检查桶中是否有足够的令牌。图4-5解释了它是如何工作的。
如果有足够的令牌,我们会为每个请求取出一个令牌,然后请求通过。
如果没有足够的令牌,则该请求被丢弃。
图 4-6 说明了令牌消耗、重新填充和速率限制逻辑的工作原理。 在此示例中,令牌桶大小为 4,重新填充速率为每 1 分钟 4 个。
令牌桶算法需要两个参数:
桶大小:桶内允许的最大令牌数。
填充速率:每秒放入到桶内的令牌数量。
我们需要多少个桶?这取决于限流规则,并且会有所不同。 以下是几个例子。
通常需要为不同的API端点使用不同的桶。例如,如果一个用户被允许每秒发1个帖子,每天添加150个好友,并且每秒钟点赞5个帖子,则每个用户需要3个桶。
如果我们需要根据IP地址对请求进行限流,每个IP地址都需要一个桶。
如果系统允许每秒最多10,000个请求,则有一个全局桶供所有请求共享是有意义的。
优点
算法容易实现
占用内存少
令牌桶允许在短时间内进行突发流量。只要有剩余的令牌,请求就可以通过。
缺点
- 算法中有两个参数,即桶的大小和令牌的补充速率。然而,正确调整它们可能具有挑战性。