2014-09-23 8 views
17

Od dwóch dni zmagam się z uzyskiwaniem pracy sidekiq w środowisku produkcyjnym heroku. Czytałem całą dostępną dokumentację dotyczącą podobnych problemów, ale nadal nie byłem w stanie stworzyć działającego rozwiązania, naprawdę chciałbym pomóc!sidekiq nie generuje pliku sidekiq.pid na heroku, używając z Redistogo

Po wdrożeniu na Heroku moi awarii aplikacji i pojawia się następujący błąd ślad stosu:

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 

Najpierw sidekiq działa poprawnie na moim komputerze lokalnym. Używam REDISTOGO Heroku dla redis, w lokalnej produkcji, sidekiq zostały wskazane na REDISTOGO poprawnie i działa dobrze.

Po drugie, zgodnie ze śladem stosu, szczególnie tej linii No such file or directory @ rb_sysopen - /app/tmp/pids/sidekiq.pid; to prowadzi mnie do myślenia, że ​​z jakiegoś powodu plik sidekiq.pid nie jest generowany poprawnie podczas działania na heroku. W środowisku lokalnym plik sidekiq.pid jest generowany za każdym razem, gdy uruchamiam aplikację w katalogu app/tmp/pids/ i każdorazowo przydziela inny numer pid. Jestem guessing, który podczas działania na Heroku, próbował uzyskać odczyt z tego pliku, ale nie mógł go znaleźć.

Oto zawartość w moich Procfile:

web: bundle exec rails server 
worker: bundle exec sidekiq -C config/sidekiq.yml 

Oto treść moich 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 

Oto treść w moim 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 

Aktualizacji 1:

Używam carrierwave i carrierwave-backgrounder w synchronizacji z sidekiq.

+0

Dlaczego w ogóle tworzysz plik pidfile? –

+0

@MikePerham Hey Mike, wiem, że jesteś autorem sidekiq, doceniam twoją uwagę na tę sprawę! Nie celowo używałem słowa "pid".Jestem nowy w sidekiq i pomyślałem, że to domyślne zachowanie, ponieważ podczas mojej implementacji nie natrafiłem na żadną konfigurację, która odwołuje się wszędzie do 'pid'. Co byś zasugerował, czy robię coś złego? Może nie używanie pid jest optymalnym sposobem na wdrożenie sidekiq? Nie znalazłem zbyt wiele dokumentacji na część pid. – Stephens

+0

@MikePerham w moim lokalnym środowisku, za każdym razem kiedy używam 'starszego startu', widzę następujące linie: ' 17:28:57 web.1 | rozpoczęto od pid 20788' '17:28:57 worker.1 | Rozpoczęty z pid 20789' Numer pid byłby inny za każdym razem. – Stephens

Odpowiedz

24

Ten problem został rozwiązany za pomocą następujących działań:

1) Dzięki @MikePerham dla wskazujące mnie we właściwym kierunku, najpierw usunąłem tę linię w moim sidekiq.yml pliku:

:pidfile: ./tmp/pids/sidekiq.pid 

2) Następnie, w moim Procfile, musiałem użyć następującą linię do zastąpienia pochodzenia:

web: bundle exec rails server -p $PORT 
worker: bundle exec sidekiq -C config/sidekiq.yml 

teraz sidekiq pracuje poprawnie z czerwonym istogo na heroku dla mnie.

+0

To działało jak dziwaczny urok. Dziękuję Ci bardzo! –

7

została ustalona poprzez pids katalogu w tmp katalogu root projektu

8

Uważam, że warto dodać katalog do repozytorium i ponownie wdrożyć aplikację.

mkdir -p tmp/pids 
touch tmp/pids/.gitkeep 
git add -f tmp/pids/.gitkeep 
git commit -m 'Keep tmp/pids directory in repo' 

Mam nadzieję, że to pomoże.

+0

To działa. Dzięki! –

+0

To działa. Szyny 4, Foreman i Sidekiq. –

+0

To działa. Dzięki! – Jason