redis - Redis 的速率限制模式 - 准确性
问题描述
背景
我有一个向外部服务器发送 HTTP 请求的应用程序。应用程序与具有严格速率限制策略的其他服务通信。例如,每秒 5 次调用。任何高于允许速率的调用都会得到429
错误代码。
该应用程序部署在云中并由多个实例运行。任务来自共享队列。
Redis 速率限制模式同步的允许速率限制。
我目前的实现
假设速率限制为每秒 5:我将时间分成多个“窗口”。每个窗口的最大速率为 5。在每次调用之前,我检查计数器是否小于 5。如果是,则触发请求。如果不是,请等待下一个窗口(一秒钟后)。
问题
为了在 Redis 周围同步应用程序,我需要对 Redis 调用:INCR 和 EXPR。假设每个调用可能需要大约 250 毫秒才能返回。所以我们的检查时间约为 500 毫秒。话虽如此,在某些情况下,您会检查旧窗口,因为在您得到答案之前,当前的第二个窗口已更改。万一在下一秒我们将有另外 5 个快速调用 - 它将导致429
从服务器。
问题
如您所见,这种模式并不能真正确保我的应用程序的速率达到 5 次调用\秒。
你建议如何做正确?
解决方案
推荐阅读
- python - 如何克隆 PyPI 存储库并作为本地存储库维护
- javascript - 了解three.js中的定位系统
- jackson - FasterXML 中的 UnrecognizedPropertyException
- python - 如果包含输入类型文件,Django 表单返回 404 Page not found
- arrays - 如何根据单元格值将地址传递给 Vlookup(Google 表格)
- excel - 数据透视缓存“类型不匹配”中的数据透视表错误
- reactjs - 样式化组件:溢出在 Safari 中不起作用
- go - 一个按钮内具有不同对齐方式的文本字段
- flutter - Parse Server SDK - Include Object 方法不适用于在颤动中获取整个对象
- c# - C#正则表达式十进制数从复杂字符串中拆分出来