Search code examples
ruby-on-railsrubyherokudelayed-job

How to Specify One Worker on a Queue for Delayed Jobs


How can I specify one worker for a specific queue when using delayed jobs? I know I can run this command:

# Use the --pool option to specify a worker pool. You can use this option 
# multiple times to start different numbers of workers for different queues.
# The following command will start 1 worker for the tracking queue, 
# 2 workers for the mailers and tasks queues, and 2 workers for any jobs:

RAILS_ENV=production script/delayed_job --pool=tracking --pool=mailers,tasks:2 --pool=*:2 start

But since we are using heroku we are using a procfile that will run our workers:

worker: bundle exec foreman start -f Procfile.workers and our worker file runs the jobs:

worker_1: bundle exec rake jobs:work
worker_2: bundle exec rake jobs:work

What I am wanting to do however, is something like:

bundle exec rake jobs:work --queue=specific_queue

and only have one worker working on the specific_queue and other workers working on other queues.

How can I accomplish this?


Solution

  • If you take a look at Heroku's Process Types and the Procfile docs, you will find this example at the end:

    For example, using Ruby you could run two types of queue workers, each consuming different queues:

    worker:        env QUEUE=* bundle exec rake resque:work
    urgentworker:  env QUEUE=urgent bundle exec rake resque:work
    

    Delayed Job uses something similar to Resque. It uses the env variables QUEUE or QUEUES to specify the queue for that particular worker.

    You can verify that on lib/delayed/tasks.rb source code.