module Sidekiq::ThrottledWorker::Concurrency

Public Class Methods

finalize!(worker_class, jid) click to toggle source
# File lib/sidekiq/throttled_worker/concurrency.rb, line 20
def finalize!(worker_class, jid)
  Sidekiq::ThrottledWorker.redis.with do |conn|
    conn.zrem(concurrency_key(worker_class), jid)
  end
end
limit?(worker_class, jid) click to toggle source
# File lib/sidekiq/throttled_worker/concurrency.rb, line 5
def limit?(worker_class, jid)
  # only allow one worker check limit
  concurrency = worker_class.get_sidekiq_options["concurrency"]
  ttl = (worker_class.get_sidekiq_options["concurrency_ttl"] || 900) # assume worker should finish run in 15 minutes, and worker may be block completely max for 15 minutes in extreme case
  now = Time.now.to_f
  Sidekiq::ThrottledWorker.redis.with do |conn|
    conn.zremrangebyscore(concurrency_key(worker_class), "-inf", "(#{now}")
    return true if conn.zcard(concurrency_key(worker_class)) >= concurrency && conn.zscore(concurrency_key(worker_class), jid).nil?
    conn.zadd(concurrency_key(worker_class), (now + ttl).to_i, jid)
    conn.expire(concurrency_key(worker_class), (now + ttl).to_i)

    false
  end
end

Private Class Methods

concurrency_key(worker_class) click to toggle source
# File lib/sidekiq/throttled_worker/concurrency.rb, line 28
def concurrency_key(worker_class)
  "sidekiq:throttled_worker:concurrency:#{worker_class}"
end