处理API费率限制?

时间:2013-05-20 08:31:09

标签: ruby-on-rails ruby ruby-on-rails-3

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

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

4 个答案:

答案 0 :(得分:4)

如果您正在使用某种后台工作程序来执行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调用,则每次重新调度查询的风险。但在那之前,一些简单的事情可能会成功!

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

  • 计算每次请求需要多少延迟
  • 检查请求前的时间,减去后的时间 请求和sleep其余的。

对于并发请求,您可以更准确,I once blogged about that here

答案 3 :(得分:0)

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

如果可以使用resque将作品排队到作业,那么您可以使用刚刚发布的gem,当您点击rate_limit时暂停队列 - 并在稍后取消暂停。

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