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

时间:2016-06-19 20:40:20

标签: python amazon-web-services scheduled-tasks celery task-queue

我正在尝试使用他们提供的REST api从站点继续抓取大量信息。我有以下约束 -

  1. 保持在api限制内(5次/秒)
  2. 利用全部限制(每秒精确拨打5个电话,每分钟拨打5 * 60个电话)
  3. 每次调用都将使用不同的参数(将从db或内存缓存中获取参数)
  4. 将从AWS EC2(或GAE)拨打电话,处理后的数据将存储在AWS RDS / DynamoDB中
  5. 现在我只是使用每分钟运行python脚本的计划任务 - 脚本进行10-20次api调用 - >处理响应 - >将数据存储到DB。我想扩展这个程序(每分钟做5 * 60 = 300次调用)并通过代码使其可管理(推送新任务,轻松暂停/恢复它们,监控故障,改变呼叫频率)。

    我的问题是 - 实现这一目标的最佳工具是什么?任何建议/指导/链接都表示赞赏。

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

1 个答案:

答案 0 :(得分:1)

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

我可以想到两个选择:

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