Introduction
Proper queue design ensures jobs process efficiently. Sidekiq lets you define multiple queues with different priorities and run separate worker processes for each.
Key Concepts
- Queue Priority: Weighted polling — higher-weight queues are checked more frequently.
- Queue-Specific Workers: Running separate Sidekiq processes for different queues.
- Queue Monitoring: Checking queue sizes, latency, and retry counts.
Real World Context
A production app might have: critical (payments), default (standard work), mailers (emails), low (reports). Each gets appropriate worker resources.
Deep Dive
Queue Priority Design
yaml# config/sidekiq.yml :queues: - critical # Payment processing, security - default # Standard jobs - mailers # Email delivery - low # Non-urgent tasks
Queue-Specific Workers
bash# Critical jobs only bundle exec sidekiq -q critical -c 5 # Everything except low priority bundle exec sidekiq -q critical -q default -q mailers -c 10 # Batch processing bundle exec sidekiq -q low -q reports -c 3
Job-Specific Queues
rubyclass PaymentJob < ApplicationJob queue_as :critical sidekiq_options retry: 5, backtrace: 10 end
Queue Monitoring
rubySidekiq::Queue.new('default').size Sidekiq::Queue.new('critical').latency Sidekiq::RetrySet.new.size Sidekiq::DeadSet.new.size
Common Pitfalls
- Using only one queue — All jobs compete for the same workers. Separate by priority.
- Not monitoring queue latency — A growing queue with increasing latency signals you need more workers.
Best Practices
- Name queues by purpose —
:critical,:mailers,:importsare clearer than:high,:medium,:low. - Run dedicated workers for critical queues — Ensures time-sensitive jobs are never blocked.
Summary
- Design queues by job priority and purpose.
- Use queue weights for relative priority.
- Run separate worker processes for different queue tiers.
- Monitor queue sizes and latency for health.
Code Examples
ruby
# Check queue health
stats = Sidekiq::Stats.new
puts "Processed: #{stats.processed}"
puts "Failed: #{stats.failed}"
puts "Enqueued: #{stats.enqueued}"
Sidekiq::Queue.all.each do |q|
puts "#{q.name}: #{q.size} jobs, #{q.latency.round(1)}s latency"
end