Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sidekiq jobs stuck in queue on Heroku

I have a Sidekiq worker functioning well locally, but when deployed to Heroku the jobs get stuck in the queue. I am using Redis-to-go nano and have it up and running, and I have scaled the worker to 1 on Heroku and can see that it is up. I am just using the default queue -- nothing custom or fancy. Here is my code:

config/unicorn.rb:

Sidekiq.configure_client do |config|
  config.redis = { size: 1, namespace: 'sidekiq' }
end

config/initializers/redis.rb

uri = URI.parse(ENV["REDISTOGO_URL"] || "redis://localhost:6379")
REDIS = Redis.new(:url => ENV['REDISTOGO_URL'])

Procfile

web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb
worker: bundle exec sidekiq -c 5 -v -q default

I can see the job in the queue but it is not processing like it does locally. Any advice is much appreciated - thanks!

like image 388
Andy Weiss Avatar asked Oct 08 '14 17:10

Andy Weiss


People also ask

Is Sidekiq a queue?

Out-of-the-box Sidekiq uses a single queue named "default," but it's possible to create and use any number of other named queues if there is at least one Sidekiq worker configured to look at every queue.

How do I manually run a Sidekiq job?

To run sidekiq, you will need to open a terminal, navigate to your application's directory, and start the sidekiq process, exactly as you would start a web server for the application itself. When the command executes you will see a message that sidekiq has started.

How does Sidekiq queue work?

Sidekiq server process pulls jobs from the queue in Redis and processes them. Like your web processes, Sidekiq boots Rails so your jobs and workers have the full Rails API, including Active Record, available for use. The server will instantiate the worker and call perform with the given arguments.


2 Answers

Not sure exactly what the problem was, but following this tutorial with some modifications worked out for me: http://manuelvanrijn.nl/blog/2012/11/13/sidekiq-on-heroku-with-redistogo-nano/

In short, I moved the configuration into a sidekiq.rb initializer, and deleted all of the url and namespace information.

require 'sidekiq'

Sidekiq.configure_client do |config|
config.redis = { :size => 1 }
end

Sidekiq.configure_server do |config|
config.redis = { :size => 4 }
end

The tutorial link I referenced has a handy calculator to detemrine the correct size values. Still not sure whether that's what was tripping me up or some version of the namespace conflict alluded to in Mark's answer.

Also, I didn't use the sidekiq.yml portion of the tutorial, because the sidekiq wiki says newer versions of rails don't like it. Instead, I set concurrency to 2 in the bundle exec command of the Procfile, like this:

worker: bundle exec sidekiq -c 2  

Hope this is helpful to anyone who has a similar issue in the future! Thanks to all who tried to help.

like image 87
Andy Weiss Avatar answered Nov 19 '22 12:11

Andy Weiss


Just adding my two cents here: in my case, I had forgotten to add the queue's name to config/sidekiq.yml =]

like image 25
Thyago B. Rodrigues Avatar answered Nov 19 '22 13:11

Thyago B. Rodrigues