class Sidekiq::Middleware::Server::Limiter

Constants

DEFAULT_INTERVAL

Public Class Methods

new(options = {}) click to toggle source
# File lib/sidekiq/limiter.rb, line 11
def initialize(options = {})
  @queues = Sidekiq.options[:process_limits]
  @interval = options.fetch(:interval, DEFAULT_INTERVAL)
end

Public Instance Methods

call(worker, msg, queue) { || ... } click to toggle source
# File lib/sidekiq/limiter.rb, line 16
def call(worker, msg, queue)
  if @queues[queue] && is_busy?
    Sidekiq::Client.push('queue' => queue, 'class' => worker.class.name, 'args' => msg['args'],
                         'at' => (Time.now + @interval).to_f)
  else
    yield
  end
end
is_busy?() click to toggle source
# File lib/sidekiq/limiter.rb, line 25
def is_busy?
  Sidekiq.redis do |conn|
    workers_count = conn.smembers('workers').count do |w|
      next unless w =~ /^#{hostname}/

      options = conn.get("worker:#{w}")
      next unless options

      options = Sidekiq.load_json(options)
      @queues[options['queue']]
    end

    workers_count >= 2
  end
end