summaryrefslogtreecommitdiff
path: root/lib/throttled_api_request.rb
diff options
context:
space:
mode:
Diffstat (limited to 'lib/throttled_api_request.rb')
-rw-r--r--lib/throttled_api_request.rb25
1 files changed, 16 insertions, 9 deletions
diff --git a/lib/throttled_api_request.rb b/lib/throttled_api_request.rb
index 3f30c56..1020071 100644
--- a/lib/throttled_api_request.rb
+++ b/lib/throttled_api_request.rb
@@ -1,18 +1,25 @@
-class ThrottledApiRequest < Struct.new(:api_name, :unit_time, :requests_per)
+# limits is in the format:
+# limits = [
+# {:unit_time => 10.seconds, :requests_per => 10},
+# {:unit_time => 10.minutes, :requests_per => 500},
+# ]
+class ThrottledApiRequest < Struct.new(:api_name, :limits)
def before(job)
loop do
sleep_for = -1
ActiveRecord::Base.transaction do
ApiRequests.create(:api_name => self.api_name)
- recent_requests = ApiRequets.
- where(:api_name => self.api_name).
- where("updated_at > ?", Time.now.utc - self.unit_time).
- order(:updated_at)
- if (recent_requests.count > self.requests_per)
- sleep_for = Time.now.utc - recent_requests[recent_requests.count-self.requests_per].updated_at
+ self.limits.each do |limit|
+ recent_requests = ApiRequets.
+ where(:api_name => self.api_name).
+ where("updated_at > ?", Time.now.utc - limit[:unit_time]).
+ order(:updated_at)
+ if (recent_requests.count > limit[:requests_per])
+ sleep_for = [sleep_for, Time.now.utc - recent_requests[recent_requests.count-limit[:requests_per]].updated_at].max
+ end
+ end
+ if sleep_for != -1
raise ActiveRecord::Rollback
- else
- sleep_for = -1
end
end
if sleep_for != -1