限制Rails应用程序生成的出站API调用频率

13

我不是专业的网站开发者,但作为爱好,我喜欢涉足网站。最近,我着手开发一个Rails应用程序作为学习框架的实战项目。我的玩具应用程序的目标是通过API从另一个服务中获取数据,并通过搜索功能使其可供查询。

然而,我想要提取数据的服务对每分钟执行的API调用数量施加了速率限制。我计划让我的应用程序每天更新一次,这可能会生成远远超出外部服务提供的限制的大量API调用。

我希望尊重外部站点的表现,因此想限制我的应用程序执行调用的速率。

我已经做了一些搜索,但找到的绝大部分教程材料和预构建库都是关于对web应用程序的入站API请求进行节流,而我几乎找不到关于控制出站调用流量的讨论。

作为业余网站开发者和Rails新手,我完全有可能在错误的地方进行搜索。因此,我的问题是:

  • 是否有一个很棒的网站聚合了与限制外发API请求相关的Rails教程资料?

  • 是否有任何Ruby gem或其他库可以帮助我限制请求?

我有一些想法,可以使用基于队列的worker(如DelayedJob或Resque)编写限制系统来管理API调用,但如果已经有好的预构建解决方案,我宁愿花周末时间建立站点的其他部分。

3个回答

9

3
现在有一个适用于此的宝石库:throttle-queue。它接受代码块并确保每秒只执行x次。以下是从Readme中提取的示例,每秒仅获取三个文件:
require 'throttle-queue'

q = ThrottleQueue.new 3
files.each {|file|
    q.background(file) {
        fetch file
    }
}

0

没有人谈论出站流量控制的原因是它通常相当简单,因为可以控制它。控制带宽可能有点困难,但控制请求数量呢?

ri Kernel#sleep

所以,如果您每分钟被允许进行10个API调用,那么您只需要在每个调用之后sleep(6)。


嗯,那似乎是一个合理的解决方案-但我对它有一些问题。1)需要进行一些微调才能优化睡眠时间;2)看起来工作线程在睡眠期间将完全停滞。我更喜欢一种解决方案,即当超过调用限制时,使工作线程推迟执行API调用并处理其他任务,而不仅仅是挂起。 - Sharpie
  1. 你说的优化是什么意思?CPU使用率已经是0%了,再怎么优化也没用!
  2. 是的,这就是重点!如果你想要执行其他操作,就把它们交给另一个线程。我不太明白为什么你对每日批处理作业的性能如此担忧。
*) 已编辑有关使用情况的答案
- user336851
我想现在我的主要关注点是,我正在考虑将应用程序部署在像Heroku这样的平台上。在这种情况下,我希望优化每个线程尽可能高效地处理任务。由于Heroku按工作人员收费,因此我希望尽可能少地使用工作线程。也许我试图过度复杂化问题...简单的解决方案也是好的解决方案。 - Sharpie
既然你说你是唯一的用户,我就假设你会选择自行托管。我不熟悉Heroku,但按照绿色线程数量计费没有任何意义,因为您一次只能有一个线程处于活动状态。因此,我认为他们的'workers'实际上是不同的ruby进程。在那里,可能可以创建许多线程,但只有一个线程被分配了被限制的调用,并且其他线程可以做任何其他事情。如果您无法调用Thread.new并且假设没有工作启动费用,您可以在每次调用后退出worker,并在几秒钟后在另一个worker上重新安排下一个调用。 - user336851

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接