我有多个服务器/工作线程正在通过一个任务队列执行 API 请求。(Django 与 Memcached 和 Celery 一起排队)API 请求限制为每秒 10 个请求。如何对其进行速率限制,以使请求总数(所有服务器)不会超过限制?
我已经浏览了一些相关的速率限制问题,我猜它们专注于更线性、非并发的场景。我应该采取什么样的方法?
您是否查看过番石榴项目的速率限制器?他们在最新版本之一中引入了此类,它似乎部分满足您的需求。
当然,它不会计算分布式环境中多个节点的速率限制,但您可以做的是根据正在运行的节点数量动态配置速率限制(即对于 5 个节点,您的速率限制为每秒 2 个 API 请求)
在做一个开源项目来解决这个叫做Limitd的确切问题。虽然我还没有节点以外的其他技术的客户端,但协议和想法很简单。
非常欢迎您的反馈。
不幸的是,我解决了这个问题,不适用于您的技术:带宽限制/令牌桶
如果你想实现它,这是实现的想法:
这是一种令牌桶算法,可将包含的令牌转换为自上次完全为空以来的时间戳。每个消耗都会更新此时间戳(锁定),以便每个进程共享相同的状态。