1

背景

我有一个向外部服务器发送 HTTP 请求的应用程序。应用程序与具有严格速率限制策略的其他服务通信。例如,每秒 5 次调用。任何高于允许速率的调用都会得到429错误代码。

该应用程序部署在云中并由多个实例运行。任务来自共享队列。

Redis 速率限制模式同步的允许速率限制。

我目前的实现

假设速率限制为每秒 5:我将时间分成多个“窗口”。每个窗口的最大速率为 5。在每次调用之前,我检查计数器是否小于 5。如果是,则触发请求。如果不是,请等待下一个窗口(一秒钟后)。

问题

为了在 Redis 周围同步应用程序,我需要对 Redis 调用:INCR 和 EXPR。假设每个调用可能需要大约 250 毫秒才能返回。所以我们的检查时间约为 500 毫秒。话虽如此,在某些情况下,您会检查旧窗口,因为在您得到答案之前,当前的第二个窗口已更改。万一在下一秒我们将有另外 5 个快速调用 - 它将导致429从服务器。

问题

如您所见,这种模式并不能真正确保我的应用程序的速率达到 5 次调用\秒。

你建议如何做正确?

4

0 回答 0