2014-09-23 12 views
17

Ho lottato per due giorni per ottenere il lavoro sidekiq sull'ambiente di produzione di heroku. Ho letto tutta la documentazione disponibile su problemi simili, e ancora non sono stato in grado di produrre una soluzione funzionante, mi piacerebbe davvero un aiuto!sidekiq non genera il file sidekiq.pid su heroku, utilizzando con Redistogo

Dopo la distribuzione su Heroku, i miei applicazione si blocca e ricevo il seguente stack trace di errore:

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 

In primo luogo, sidekiq funziona correttamente sulla mia macchina locale. Sto usando il REDISTOGO di heroku per i redis, sulla produzione locale, sidekiq sono stati puntati correttamente al REDISTOGO e funzionano bene.

Secondo, in base alla traccia dello stack, in particolare questa riga No such file or directory @ rb_sysopen - /app/tmp/pids/sidekiq.pid; mi porta a pensare che per qualche motivo il file sidekiq.pid non venga generato correttamente durante l'esecuzione su heroku. Nell'ambiente locale, il file sidekiq.pid viene generato ogni volta che avvio l'app nella directory app/tmp/pids/ e assegna un numero diverso pid ogni volta. Sono guessing che durante l'esecuzione su heroku, sidekiq ha tentato di leggere da questo file ma non è riuscito a trovarlo.

Ecco contenuto nei miei Procfile:

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

Ecco contenuti nei miei 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 

Ecco il contenuto della mia 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 

Aggiornamento 1:

01.235.164,106 mila

Sto utilizzando carrierwave e carrierwave-backgrounder in sincronizzazione con sidekiq.

+0

Perché stai creando un pidfile? –

+0

@MikePerham Hey Mike, so che sei l'autore di sidekiq, apprezzo la tua attenzione su questo argomento! Non stavo usando 'pid' intenzionalmente.Sono nuovo di sidekiq e ho pensato che fosse il comportamento predefinito, perché durante la mia implementazione non ho eseguito alcuna configurazione che faccia riferimento a 'pid' ovunque. Cosa suggeriresti, sto facendo qualcosa di sbagliato? Forse non usare pid è il modo migliore per implementare sidekiq? Non ho trovato troppa documentazione sulla parte pid. – Stephens

+0

@MikePerham sul mio ambiente locale, ogni volta che usa 'start' caposquadra, vedo le seguenti righe: ' 17:28:57 web.1 | iniziato con pid 20788' '17:28:57 worker.1 | iniziato con pid 20789' Il numero pid sarebbe diverso ogni volta. – Stephens

risposta

24

Questo problema è stato risolto attraverso le seguenti azioni:

1) Grazie a @MikePerham per avermi nella giusta direzione, in primo luogo ho rimosso questa linea nella mia sidekiq.yml di file:

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

2) Poi, nel mio Procfile, ho dovuto utilizzare la seguente riga di sostituire l'origine:

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

Ora sidekiq funziona correttamente con rosso istogo su heroku per me.

+0

Questo ha funzionato come un incantesimo. Grazie mille! –

7

è stato risolto facendo pids directory in tmp directory nella root del progetto

8

ho trovato utile per aggiungere la directory al repository e re-distribuire l'applicazione.

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

Spero che questo aiuti.

+0

Funziona. Grazie! –

+0

Questo funziona. Rails 4, Foreman e Sidekiq. –

+0

Funziona. Grazie! – Jason