2014-10-08 3 views
6

У меня есть работник Sidekiq, хорошо работающий локально, но при развертывании в Heroku задания застревают в очереди. Я использую Redis-to-go nano и запускаю его, и я увеличил рабочий до 1 на Heroku и вижу, что он работает. Я просто использую очередь по умолчанию - ничего нестандартного или необычного. Вот мой код:Рабочие места Sidekiq застревают в очереди на Heroku

конфигурации/unicorn.rb:

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

конфигурации/Инициализаторы/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 

Я вижу работу очередь, но она не обрабатывается, как локально. Любые советы очень ценятся - спасибо!

+0

Попробуйте запустить 'Heroku запустить console' и запустить работу синхронно' SomeWorker.new .perform (some_arg) ', это может вызвать ошибку и перепланировать. – Ollie

+0

Привет, спасибо за быстрый ответ. Запуск в консоли heroku выполнил ожидаемые действия (т. Е. Он сгенерировал нового пользователя с правильными параметрами); однако я не вижу никаких доказательств того, что он работал в веб-интерфейсе Sidekiq, т. е. он не был закрыт, но не был обработан. Есть предположения? –

+0

Как только я получил его для работы с консолью heroku, просто из любопытства я попытался запустить работу синхронно из своего приложения .... Но задания все еще застревают в очереди, хотя я передаю одни и те же аргументы , –

ответ

6

Не уверен, что именно то, что проблема была, но после этого урока с некоторыми модификациями разработаны для меня: http://manuelvanrijn.nl/blog/2012/11/13/sidekiq-on-heroku-with-redistogo-nano/

Короче говоря, я переместил конфигурацию в sidekiq.rb инициализаторе и удалены все URL и информацию о пространстве имен.

require 'sidekiq' 

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

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

Ссылка на учебник, на которую я ссылаюсь, имеет удобный калькулятор, чтобы определить правильные значения размера. Все еще не уверен, что это то, что меня отключило, или какую-то версию конфликта пространства имен, упомянутую в ответе Марка.

Кроме того, я не использовал часть sidekiq.yml учебника, потому что sidekiq wiki говорит, что новым версиям рельсов это не нравится. Вместо этого, я установил параллелизм 2 в расслоении ехеса команде PROCFILE, как это:

worker: bundle exec sidekiq -c 2 

Надеется, что это полезно для тех, кто имеет подобный вопрос в будущем! Спасибо всем, кто пытался помочь.

0

Вам необходимо настроить сервер для использования того же пространства имен.

+0

Привет, Майк, большое спасибо. Я зашел в расширенную часть вики Sidekiq и нашел этот пример: Sidekiq.configure_server do | config | config.redis = {URL: 'Redis: //redis.example.com: 7372/12', пространства имен: 'mynamespace'} database_url = ENV [ 'DATABASE_URL'] , если database_url ENV [ 'DATABASE_URL'] = "# {database_url}? pool = 25" ActiveRecord :: Base.install_connection end end Я ввел его там, где я настраиваю клиент, меняя URL-адрес URL-адреса, который я вижу в нижней части моего веб-сайта Sidekiq, и меняю пространство имен в соответствии с пространством имен клиентов. Но не повезло. –

1

Просто добавить свои два цента здесь: в моем случае, я забыл добавить имя в очереди к конфигурации/sidekiq.yml =]