限流算法

reco_luan

1. 令牌桶(Token bucket)

令牌桶(Token bucket)算法广泛用于速率限制。 它简单易懂,常被互联网公司采用。 Amazon [5] 和 Stripe [6] 都使用这个算法来限制他们的 API 请求。

令牌桶算法的工作原理如下:

  • 令牌桶是一个具有预定义容量的容器。 令牌会以预定的速率定期放入桶中, 一旦桶满了,就不再添加令牌。 如图4-4所示,令牌桶容量为4,注入装置每秒向桶中放入2个令牌,一旦桶满了,多余的令牌就会溢出。

  • 每个请求都会消耗一个令牌。当一个请求到达时,我们检查桶中是否有足够的令牌。图4-5解释了它是如何工作的。

    • 如果有足够的令牌,我们会为每个请求取出一个令牌,然后请求通过。

    • 如果没有足够的令牌,则该请求被丢弃。

图 4-6 说明了令牌消耗、重新填充和速率限制逻辑的工作原理。 在此示例中,令牌桶大小为 4,重新填充速率为每 1 分钟 4 个。

令牌桶算法需要两个参数:

  1. 桶大小:桶内允许的最大令牌数。

  2. 填充速率:每秒放入到桶内的令牌数量。

我们需要多少个桶?这取决于限流规则,并且会有所不同。 以下是几个例子。

  • 通常需要为不同的API端点使用不同的桶。例如,如果一个用户被允许每秒发1个帖子,每天添加150个好友,并且每秒钟点赞5个帖子,则每个用户需要3个桶。

  • 如果我们需要根据IP地址对请求进行限流,每个IP地址都需要一个桶。

  • 如果系统允许每秒最多10,000个请求,则有一个全局桶供所有请求共享是有意义的。

优点

  • 算法容易实现

  • 占用内存少

  • 令牌桶允许在短时间内进行突发流量。只要有剩余的令牌,请求就可以通过。

缺点

  • 算法中有两个参数,即桶的大小和令牌的补充速率。然而,正确调整它们可能具有挑战性。

2. 漏桶算法(Leaking bucket)

3. 固定窗口计数器(Fixed window counter)

4. 滑动窗口日志(Sliding window log)

5. 滑动窗口计数器(Sliding window counter)

最后更新时间 3/23/2025, 3:51:59 AM