8

我有一个应用程序,它设置为每天一次对多个 API 进行预定调用。这很好用,但我知道我正在调用的一些 API(例如 Twitter)有速率限制。随着我拨打的电话数量不断增加,任何人都可以推荐一种方法来限制我的通话,以便我可以每小时/分钟发送 x 次突发等?

我找到了Glutton Ratelimit gem,有人在用它吗?有用吗?还有其他我应该看的吗?

4

4 回答 4

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 调用,则可能会每次重新安排查询的风险。但在那之前,一些简单的事情可能会奏效!

于 2013-05-20T09:36:38.500 回答
0

我知道这是一个老问题,但想提一点,以防其他人遇到同样的问题。

如果可以使用 resque 将工作排队到作业,那么您可以使用我刚刚发布的 gem,它会在您达到 rate_limit 时暂停队列 - 并在稍后取消暂停。

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

于 2014-12-30T17:35:08.463 回答
0

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

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

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

于 2013-05-20T09:47:25.040 回答
0

除非您正在发出并发请求,否则没有什么意义。

  • 弄清楚每个请求需要多少延迟
  • 检查请求之前的时间,从请求之后的时间中减去sleep剩余的时间。

使用并发请求,您可以更准确,我曾经在这里写过博客

于 2013-05-20T09:51:41.763 回答