【发布时间】:2021-04-28 06:50:05
【问题描述】:
我在比较令牌桶和固定窗口限速算法,但对这两种算法的流量突发有点混淆。
假设我想将流量限制为 10 个请求/分钟。
在令牌桶中,令牌以每分钟 10 个令牌的速度添加。
Time Requests AvailableTokens
10:00:00 0 10 (added 10 tokens)
10:00:58 10 0
10:01:00 0 10 (added 10 tokens)
10:01:01 10 0
现在,如果我们在时间戳 10:01:01 看到,在最后一分钟允许了 20 个请求,超过了我们的限制。
同样,使用固定窗口算法。 窗口大小:1 分钟。
Window RequestCount IncomingRequests
10:00:00 10 10 req at 10:00:58
10:01:00 10 10 req at 10:01:01
这里也有类似的问题。
这两种算法是否都存在这个问题,还是我的理解存在差距?
【问题讨论】:
-
这里here 应该回答你的大部分问题,而且比这里的答案要详细得多。简而言之,在 Token bucket 中,上述场景不应该发生/可以预防,尽管还有其他问题。在固定窗口的情况下,双倍率问题可能完全按照您描述的方式发生,因此要消除这种可能性,您需要将速率设置为 N/2,其中 N 是您想要的最大速率。
-
我之前浏览过此链接,但找不到我所关心的问题的答案。我的理解是为了防止令牌桶中的这个问题,我们必须优化桶的大小,因为它定义了可以提供的最大突发流量。但这类似于在固定窗口中将速率从 N 降低到 N/2。
-
@shamis 您提供的链接实现了带有时间戳概念的令牌桶,因此它包括某种形式的滑动窗口方法,该方法不适用于普通令牌桶方法的这个问题。
标签: algorithm throttling rate-limiting