module FoundersToolkit::Util::RateLimitable

Public Instance Methods

rate_limiter(name, key:, threshold:, interval:, retry_from: []) click to toggle source
# File lib/founders_toolkit/util/rate_limitable.rb, line 26
def rate_limiter(name, key:, threshold:, interval:, retry_from: [])
  limiter_name = "#{name}_limiter"
  define_method(limiter_name) do |&block|
    limiter = instance_variable_get("@#{limiter_name}".to_sym)
    limiter ||= instance_variable_set("@#{limiter_name}".to_sym, Ratelimit.new(name))

    while limiter.exceeded?(__send__(key), threshold: threshold, interval: interval)
      statsd.increment ['thottled', limiter_name].join('.')
      sleep 5
    end

    result = statsd.time(['retryable', limiter_name].join('.')) do
      Retryable.retryable(tries: 3, on: retry_from) { block.call }
    end
    limiter.add __send__(key)
    result
  end
end