Rails: запуск Sidekiq на Heroku
У меня возникла проблема с запуском Sidekiq в моем приложении Rails с поддержкой Heroku. У меня есть приложение, прекрасно работающее в разработке (и на Heroku без Sidekiq).
Я создал файл Procfile с:
worker: bundle exec sidekiq
Если я запустил heroku ps
, единственный процесс, который я вижу, - web.1
.
Должен ли я увидеть его для
Sidekiq?
Я получаю сообщение об ошибке:
Redis::CannotConnectError (Error connecting to Redis on localhost:6379)
в моих журналах Heroku.
UPDATE: найдено Мне, вероятно, понадобилось heroku addons:add redistogo
. Все еще не работает. Я чувствую, что мне не хватает базовой конфигурации.
Есть ли что-то, что мне нужно сделать, чтобы запустить Redis для моего приложения Heroku?
Я использую Redis/Sidekiq около дня, так что это ново для меня.
Спасибо!
Грег
Ответы
Ответ 1
Нет, вам не нужна настройка с Heroku для Sidekiq, просто добавьте плагин RedisToGo, и вы включитесь.
Не забудьте указать как минимум 1 работника для вашего приложения в конфигурацию Heroku.
Вот мой файл по умолчанию:
web: bundle exec thin start -p $PORT
worker: bundle exec sidekiq -c 5 -v
Ответ 2
Стоит проверить, действительно ли процесс sidekiq начинается с этой команды:
heroku ps
Если нет работника, вам может потребоваться выполнить следующую команду:
heroku ps:scale worker+1
Оказалось, что в веб-интерфейсе есть ошибка в том, что некоторым членам команды не разрешалось увеличивать число работников от 0 до 1, хотя пользовательский интерфейс, казалось, показывал это!
Ответ 3
Начиная с sidekiq версии 3.0 есть дополнительный шаг, запустите heroku config:set REDIS_PROVIDER=REDISTOGO_URL
в консоли.
Вот процесс, который я использовал для Rails 4:
В консоли:
heroku addons:create redistogo
heroku config:set REDIS_PROVIDER=REDISTOGO_URL
В моем Procfile
я добавил:
worker: bundle exec sidekiq
В моем gemfile.rb
я добавил:
gem 'redis'
Я добавил следующий файл, config/initializers/redis.rb
:
uri = ENV["REDISTOGO_URL"] || "redis://localhost:6379/"
REDIS = Redis.new(:url => uri)
Вот ссылка в документах sidekiq.
Ответ 4
Похоже, ты почти там. Возможно, вам просто нужно установить REDISTOGO_URL в config_ganger...
heroku config
должно показать значение redistogo?
Если вы скопируете это в REDISTOGO_URL, то sidekiq должен работать?
heroku config:add REDISTOGO_URL=<redistogo value>
Edit:
Sidekiq будет использовать любой из них в настоящее время: https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/redis_connection.rb#L29-L33
Edit2:
Грег прав, потому что вам не нужно добавлять конфигурацию, если вы используете RedisToGo. Но если вы используете OpenRedis или другие поставщики Redis, вам нужно добавить REDISTOGO_URL для Sidekiq
Ответ 5
Вы можете, конечно, запустить sidekiq вместе со своей текущей очередью заданий.
В настоящее время наш Procfile выглядит следующим образом:
web: bundle exec thin start -R config.ru -e $RAILS_ENV -p $PORT
worker: bundle exec rake jobs:work
sidekiq: bundle exec sidekiq -c 5 -v
Ответ 6
Что я выяснил, так это то, что вы должны вручную масштабировать процесс следующим образом:
heroku ps:scale worker+1
Не имеет смысла, так как мой Procfile сказал:
web: bundle exec....
worker: bundle exec sidekiq
... и можно было бы ожидать, что Heroku начнет работу автоматически. В итоге мне не пришлось масштабировать веб-процесс...
Кроме того, у вас могут быть проблемы с этой строкой: worker: bundle exec sidekiq
Добавьте флаги для согласованности:
worker: bundle exec sidekiq -c 5 -v