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.rb32
1 files changed, 32 insertions, 0 deletions
diff --git a/lib/throttled_api_request.rb b/lib/throttled_api_request.rb
new file mode 100644
index 0000000..c48a66d
--- /dev/null
+++ b/lib/throttled_api_request.rb
@@ -0,0 +1,32 @@
+# 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
+ ApiRequest.create(:api_name => self.api_name)
+ self.limits.each do |limit|
+ recent_requests = ApiRequest.
+ 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
+ end
+ end
+ if sleep_for != -1
+ sleep(sleep_for)
+ else
+ break
+ end
+ end
+ end
+end