微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

令牌桶与固定窗口流量突发

如何解决令牌桶与固定窗口流量突发

我正在比较令牌桶固定窗口速率限制算法,但对两种算法中的流量突发有点困惑。

假设我想将流量限制为 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

这里也有类似的问题。

这两种算法是否都存在这个问题,还是我的理解有差距?

解决方法

我对这些算法也有同样的困惑。

Token Bucket 的诀窍在于 Bucket 大小 (b) 和 Refill rate(r) 不必相等。

对于您的特定示例,您可以将存储桶大小设置为 b = 5,再填充率 r = 1/10(每 10 秒 1 个令牌)。

在此示例中,客户端仍然能够每分钟发出 11 个请求,但在您的示例中已经少于 20 个,并且它们会随着时间的推移而分散。而且我也相信,如果您使用这些参数,您可以在根本不允许超过 10 个请求/分钟的情况下实现策略。

 Time      Requests AvailableTokens
10:00:00     0          5 (we have 5 tokens initially)
10:00:10     0          5 (refill attempt failed cause Bucket is full)
10:00:20     0          5 (refill attempt failed cause Bucket is full)
10:00:30     0          5 (refill attempt failed cause Bucket is full)
10:00:40     0          5 (refill attempt failed cause Bucket is full)
10:00:50     0          5 (refill attempt failed cause Bucket is full)
10:00:58     5          0 
10:01:00     0          1 (refill 1 token)
10:01:10     0          2 (refill 1 token)
10:01:20     0          3 (refill 1 token)
10:01:30     0          4 (refill 1 token)
10:01:40     0          5 (refill 1 token)
10:01:49     5          0 
10:01:50     0          1 (refill 1 token)
10:01:56     1          0

其他选项:

  • b = 10 和 r = 1/10
  • b = 9 和 r = 1/10

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。