2011-09-01 10 views
6

ho bisogno di iniziare 4 lavoratori Resque così ho usato seguente comandomultimodo lavoratori Resque creare processi aggiuntivi

bundle exec rake environment resque:workers RAILS_ENV=production COUNT=4 QUEUE=* VERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid >> log/resque_worker_QUEUE.log 

Ma andare a interfaccia web, in realtà è stato iniziando 8 lavoratori. Esistevano due processi principali con 4 processi figlio ciascuno. Di seguito è la visualizzazione ad albero della process:

 
ruby /code_base/bundle/ruby/1.9.1/bin/rake environment resque:workers RAILS_ENV=production COUNT=4 QUEUE=* VERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid 
\_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
    \_ [ruby] 
ruby /code_base/bundle/ruby/1.9.1/bin/rake environment resque:workers RAILS_ENV=production COUNT=4 QUEUE=* VERBOSE=1 PIDFILE=tmp/pids/resque_worker.pid 
\_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
| \_ [ruby] 
\_ resque-1.15.0: Waiting for *                   
    \_ [ruby] 

Impossibile determinare che cosa sta causando l'avvio di un processo aggiuntivo?

risposta

13

Non si desidera utilizzare l'opzione COUNT = n in produzione, poiché esegue ogni worker in una thread anziché in un processo separato, che è molto meno stabile.

Ufficiale Resque docs:

Running Multiple Workers 

At GitHub we use god to start and stop multiple workers. A sample god configuration file is included under examples/god. We recommend this method. 

If you'd like to run multiple workers in development mode, you can do so using the resque:workers rake task: 

$ COUNT=5 QUEUE=* rake resque:workers 
This will spawn five Resque workers, each in its own thread. Hitting ctrl-c should be sufficient to stop them all. 

Here's the example God monitoring/configuration file fornito con Resque di eseguire più processi e here's an example for monit.

+0

Ho passato quel documento e il file di script in precedenza, ma stiamo usando Monit. Secondo questo script, sembra che ogni worker resque venga ucciso dopo il tempo WORKER_TIMEOUT. Ora, anche se eseguo una nuova distribuzione, il lavoratore potrebbe essere ancora aggiornato con il vecchio codice. Quindi, nel peggiore dei casi, impiega WORKER_TIMEOUT tempo per caricare worker con codice nuovo che può talvolta costituire un problema. Qualche idea su questo? – bikashp

+0

Non c'è niente di sbagliato nel lasciare un lavoro esistente in esecuzione completo prima di uccidere il lavoratore finché si fa girare un nuovo lavoratore con il codice appena distribuito. La chiave è inviare un segnale QUIT morbido al lavoratore in modo che esca al termine del lavoro correntemente in esecuzione. Quindi sì, puoi avere un lavoratore che esegue il vecchio codice ma è su un lavoro che è iniziato prima della distribuzione del nuovo codice. – Winfield

+0

Un altro problema che vedo con questo approccio è quando dio fallisce da solo. Man mano che i lavoratori vengono uccisi dopo WORKER_TIMEOUT, non ci saranno lavori di elaborazione dei lavoratori. – bikashp

Problemi correlati