处理API费率限制?

我有一个应用程序设置为每天一次调度多个API。 这非常好用,但我知道我正在调用的一些API(例如Twitter)有一个速率限制。 随着我正在进行的通话次数设置不断增长,有人可以推荐一种方法来限制我的通话,这样我就可以每小时/每分钟发送x的爆发等吗?

我找到了Glutton Ratelimitgem,是否有人使用它并且它有什么用? 还有其他我应该看的吗?

如果您正在使用某种后台工作程序来执行API调用,则可以在重置速率限制时重新安排在下一个时间段重新执行的任务。

class TwitterWorker include Sidekiq::Worker def perform(status_id) status = Twitter.status(status_id) # ... rescue Twitter::Error::TooManyRequests # Reschedule the query to be performed in the next time slot TwitterWorker.perform_in(15.minutes, status_id) end end 

但是,没有科学的解决方案,例如,如果您尝试在一天内执行比速率限制允许的更多API调用,则每次重新调度查询的风险。 但在那之前,一些简单的事情可能会成功!

另一种解决方案是购买允许您使用不同IP地址发送请求的代理

使用标准的http lib http://ruby-doc.org/stdlib-2.0/libdoc/net/http/rdoc/Net/HTTP.html#method-c-Proxy

我不确定你会不会受阻,但也许值得一试。 随机选择IP应该增加你的限制

除非你提出并发请求,否则它并不多。

  • 计算每个请求需要多少延迟
  • 检查请求之前的时间,从请求后的时间中减去并sleep

对于并发请求,您可以更准确, 我曾在此处发表过博文

我知道这是一个古老的问题,但是想要提一些事情以防其他人有同样的问题。

如果工作可以使用resque排队到作业,那么你可以使用我刚刚发布的gem,当你点击rate_limit时暂停一个队列 – 并且稍后取消它。

https://github.com/pavoni/resque-rate_limited_queue