如何安排或排队 api 呼叫以保持速率限制?

How can I schedule or queue api calls to maintain rate limit?

我正在尝试使用他们提供的 REST api 从网站上不断抓取大量信息。我有以下限制-

  1. 保持在 api 限制内 (5 calls/sec)
  2. 利用全部限制(每秒恰好调用 5 次,每分钟调用 5*60 次)
  3. 每次调用都会有不同的参数(参数将从数据库或内存缓存中获取)
  4. 将从 AWS EC2(或 GAE)进行调用,处理后的数据将存储在 AWS 中 RDS/DynamoDB

现在我只是使用一个计划任务,它每分钟运行一个 python 脚本 - 脚本进行 10-20 api 次调用 -> 处理响应 -> 将数据存储到数据库。我想扩展此过程(每分钟进行 5*60= 300 次调用)并使其可通过代码进行管理(推送新任务,pause/resuming 轻松完成任务,监控失败,更改调用频率)。

我的问题是 - 实现此目标的最佳可用工具是什么?任何 suggestion/guidance/link 表示赞赏。

我确实知道一些任务队列框架的名称,例如 Celery/RabbitMQ/Redis,但我对它们了解不多。但是,如果这些是解决我的问题的最佳工具,我愿意学习其中的一个或每一个,在开始之前想听听 SO 退伍军人的意见☺
另外请让我知道是否有任何其他我应该使用的 AWS 服务(SQS 或 AWS Data Pipeline?)来简化任何步骤。

您不需要仅仅为了速率限制而添加外部依赖项,因为您的用例非常简单。

我能想到两个方案:

  • 修改脚本(目前每分钟唤醒并进行 10-20 API 次调用)以每秒唤醒并进行 5 次调用(顺序或并行)。
    • 在您当前的设计中,您的 API 呼叫可能无法在 1 分钟内正确分配,即您可能在第一个(比如说 20 秒)内进行了所有 10-20 次呼叫。
    • 如果您将该脚本更改为每秒 运行,您的 API 调用率将更加平衡。
  • 将您的 Python 脚本更改为长 运行ning 守护程序,并使用速率限制器库,例如 this。您可以将后者配置为每 x 秒调用 1 次。