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.

ОБНОВЛЕНИЕ: Обнаружено, что мне, вероятно, нужно heroku addons:add redistogo. До сих пор не работает. Я чувствую, что мне не хватает какой-то базовой конфигурации.

Есть ли что-то, что мне нужно сделать, чтобы запустить Redis для моего приложения Heroku?

Я использую Redis/Sidekiq около дня, так что это для меня ново.

Спасибо!

Грег


person Greg Rogers    schedule 07.12.2012    source источник


Ответы (7)


Нет, вам не нужна никакая конфигурация с Heroku для Sidekiq, просто добавьте плагин RedisToGo, и все готово. Не забудьте указать хотя бы 1 worker для вашего приложения в конфигурации Heroku.

Вот мой Procfile по умолчанию:

web: bundle exec thin start -p $PORT
worker: bundle exec sidekiq -c 5 -v
person gdurelle    schedule 19.12.2012
comment
Ага... именно пропавший рабочий стал для меня последним камнем преткновения. Спасибо за ответ! Кстати, почему вы используете «тонкий»? Спасибо! - person Greg Rogers; 20.12.2012
comment
старый проект, поменяю на единорога. если ответ поможет вам нажать на стрелку '^' голосовать;) ++ - person gdurelle; 21.12.2012
comment
Не могли бы вы объяснить параметры -c 5 -v? - person Uri Klar; 18.05.2014
comment
c : параллелизм, v: подробный, p: порт. Вы должны прочитать документацию. В самом деле. - person gdurelle; 19.05.2014
comment
запустите bundle exec sidekiq -?, чтобы увидеть список опций с пояснениями - person Mark Gaensicke; 17.06.2014
comment
@gdurelle В реальной документации это не показано в разделе развертывания. Документация в целом очень сегментирована, и легко упустить информацию. - person Andrew Kostka; 25.10.2014
comment
Я могу получить доступ к справке по параметрам только через bundle exec sidekiq -h Не уверен, есть ли у кого-нибудь дополнительные ссылки на то, как определить параметры параллелизма. - person Clam; 01.01.2015
comment
@gdurelle что делает -c 5 -v ? - person tambakoo; 05.12.2018
comment
@tambakoo Вопрос уже задан в комментариях выше. Этот вопрос почти весь, возможно, он изменился с тех пор: c - это параллелизм, а v - многословно. - person gdurelle; 07.12.2018
comment
для тех, кто читает это: для рельсов 6 в 2020 году heroku рекомендует использовать puma. - person BKSpurgeon; 05.06.2020

Стоит проверить, действительно ли процесс sidekiq запускается с помощью этой команды:

heroku ps

Если работника нет, вам может потребоваться запустить эту команду:

heroku ps:scale worker+1

Оказывается, в веб-интерфейсе есть ошибка, заключающаяся в том, что некоторым членам команды не разрешалось увеличивать количество рабочих с 0 до 1, хотя пользовательский интерфейс, казалось, показывал это!

person justingordon    schedule 23.08.2013
comment
это. это был ответ на четыре часа почему?!?!1!?1?!?!. Спасибо. (справедливости ради мне еще нужно было добавить worker: bundle exec sidekiq -c 5 -v, но вы знаете, я делал это четыре часа) - person Ryan Crews; 19.12.2015

Начиная с 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.

person Steve    schedule 03.07.2015

Дополняющий ответ gdurelle:

Вам нужна некоторая конфигурация с Heroku для Sidekiq:

1) Установите драгоценные камни Sidekiq и Redis (в gemfile и в комплекте), в моем случае:

Gemfile

gem 'redis', '~> 3.1'
gem 'sidekiq', '~> 2.7', '>= 2.7.1'

2) Добавьте рабочего, если у вас нет рабочих, созданных локально, я предлагаю вам создать хотя бы одного, на всякий случай используйте это:

rails g sidekiq:worker Hard # will create app/workers/hard_worker.rb

должен создать это:

приложение/рабочие/hard_worker.rb

class HardWorker
  include Sidekiq::Worker
  def perform(name, count)
    # do something
  end
end

3) Добавьте надстройку Redis (в моем случае Heroku Redis):

heroku addons:create heroku-redis:hobby-dev

4) Добавьте свой файл redis.rb, в моем случае:

конфиг/инициализаторы/redis.rb

$redis = Redis.new(url: ENV["REDIS_URL"])

5) Добавьте Procfile или config/sidekiq.yml или оба, вот мои:

Procfile

worker: bundle exec sidekiq -c 1 -q default -q mailers 

который вы можете создать проще, вставив это в свой терминал

echo "worker: bundle exec sidekiq -c 1 -q default -q mailers" > Procfile

конфиг/sidekiq.yml

:concurrency: 1
:queues:
  - [mailers, 7]
  - [default, 5]

6) Самая важная часть — здесь: и включите переключатель для вашего рабочего, нажмите на карандаш, а затем включите отсутствующий переключатель. Теперь все должно работать нормально, хорошего дня!

person Jose Paez    schedule 30.05.2019
comment
Включение рабочего переключателя — это то, что сделало это для меня, так как я уже определил рабочего в своем Procfile. СПАСИБО! - person calyxofheld; 27.05.2020
comment
Рад, что помог, хорошего дня! - person Jose Paez; 28.05.2020
comment
Боже, я был похож на сумасшедшего, почему Sidekiq не работал, а выключатель все время был выключен. Спасибо! - person Francisco Quintero; 11.05.2021
comment
Всегда рад помочь, удачного дня, удачного кодинга! - person Jose Paez; 13.05.2021

Я обнаружил, что вам нужно масштабировать процесс вручную следующим образом:

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
person luigi7up    schedule 06.11.2016
comment
У меня была точно такая же проблема с экземпляром Heroku Redis. Не удалось включить переключатель на панели инструментов Heroku, поэтому это решение сработало для меня. - person mutantkeyboard; 01.04.2020

Похоже, вы почти у цели. Может быть, вам просто нужно установить REDISTOGO_URL в конфигурации heroku?

heroku config 

должен показать вам редистого значения?

Если вы скопируете это в REDISTOGO_URL, то sidekiq должен работать?

heroku config:add REDISTOGO_URL=<redistogo value>

Изменить. В настоящее время Sidekiq будет использовать любой из них: https://github.com/mperham/sidekiq/blob/master/lib/sidekiq/redis_connection..rb#L29-L33

Edit2: Грег прав в том, что вам не нужно добавлять конфигурацию, если вы используете RedisToGo. Но если вы используете OpenRedis или других поставщиков Redis, вам нужно добавить REDISTOGO_URL для Sidekiq.

person gef    schedule 07.12.2012
comment
Редактировать № 1 больше не является точным. - person Terra Ashley; 04.03.2016

Конечно, вы можете запустить 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
person superluminary    schedule 19.09.2014