我有一个应用程序设置为每天一次调度多个API。这非常好用,但我知道我正在调用的一些API(例如Twitter)有一个速率限制。随着我正在进行的通话次数不断增加,有人可以推荐一种方法来限制我的通话,这样我就可以每小时/每分钟发送x次爆发等吗?
我找到了Glutton Ratelimit宝石,是否有人使用它并且它有什么用?还有其他我应该看的吗?
答案 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时暂停队列 - 并在稍后取消暂停。