Sidekiq не генерирует файл sidekiq.pid на героку, используя с Redistogo
Я боролся в течение двух дней с тем, чтобы работать в sidekiq на производственной среде Heroku. Я прочитал всю имеющуюся документацию по подобным проблемам и до сих пор не смог подготовить рабочее решение, мне бы очень помогли!
После развертывания на heroku мое приложение вылетает, и я получаю следующую трассировку стека ошибок:
2014-09-23T23:38:40.905093+00:00 app[worker.1]: No such file or directory @ rb_sysopen - /app/tmp/pids/sidekiq.pid
2014-09-23T23:38:40.905122+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/bin/sidekiq:23:in `<main>'
2014-09-23T23:38:40.905119+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/gems/sidekiq-3.2.5/bin/sidekiq:7:in `<top (required)>'
2014-09-23T23:38:40.905117+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:347:in `write_pid'
2014-09-23T23:38:40.905115+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:347:in `open'
2014-09-23T23:38:40.905121+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/bin/sidekiq:23:in `load'
2014-09-23T23:38:40.905118+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:41:in `parse'
2014-09-23T23:38:40.905114+00:00 app[worker.1]: /app/vendor/bundle/ruby/2.1.0/gems/sidekiq-3.2.5/lib/sidekiq/cli.rb:347:in `initialize'
2014-09-23T23:38:39.588001+00:00 heroku[worker.1]: State changed from starting to up
Во-первых, sidekiq корректно работает на моей локальной машине. Я использую герою REDISTOGO для redis, на местном производстве, sidekiq правильно и правильно работает с REDISTOGO.
Во-вторых, согласно трассировке стека, особенно эта строка No such file or directory @ rb_sysopen - /app/tmp/pids/sidekiq.pid
; это заставляет меня думать, что по какой-то причине файл sidekiq.pid
генерируется неправильно при запуске на heroku. В локальной среде файл sidekiq.pid
генерируется каждый раз, когда я запускаю приложение в каталоге app/tmp/pids/
, и каждый раз присваивает другой номер pid
. Я guessing
, что при работе на heroku, sidekiq
пытался прочитать из этого файла, но не смог найти его.
Вот содержимое моего Procfile
:
web: bundle exec rails server
worker: bundle exec sidekiq -C config/sidekiq.yml
Вот содержимое моего config/sidekiq.yml
---
:verbose: true
:pidfile: ./tmp/pids/sidekiq.pid
:concurrency: 25
# Set timeout to 8 on Heroku, longer if you manage your own systems.
:timeout: 8
:queues:
- carrierwave
Вот содержимое моего sidekiq.rb
Sidekiq.configure_server do |config|
config.redis = { :url => ENV['REDISTOGO_URL'], :namespace => "mynamespece"}
end
Sidekiq.configure_client do |config|
config.redis = { :url => ENV['REDISTOGO_URL'], :namespace => "mynamespece"}
end
Обновить 1
:
Я использую carrierwave
и carrierwave-backgrounder
в синхронизации с sidekiq
.
Ответы
Ответ 1
Эта проблема устранена следующими действиями:
1) Благодаря @MikePerham для указания в правильном направлении, сначала я удалил эту строку в файле sidekiq.yml
:
:pidfile: ./tmp/pids/sidekiq.pid
2) Затем в моем Procfile
мне пришлось использовать следующую строку для замены начала:
web: bundle exec rails server -p $PORT
worker: bundle exec sidekiq -C config/sidekiq.yml
Теперь sidekiq работает правильно с redistogo на heroku для меня.
Ответ 2
Мне посчастливилось добавить каталог в репозиторий и повторно развернуть приложение.
mkdir -p tmp/pids
touch tmp/pids/.gitkeep
git add -f tmp/pids/.gitkeep
git commit -m 'Keep tmp/pids directory in repo'
Надеюсь, что это поможет.
Ответ 3
Это было исправлено, создав каталог pids
в каталоге tmp
в корневом каталоге проекта