2013-08-11 16 views
5

Dato che unicorno di solito gestisce più di un processo del server Rails, e dato che un runner di Resque probabilmente consuma meno risorse di una richiesta Web, dovrebbe essere possibile eseguire più di un resque worker su un singolo dyno Heroku.Qualcuno esegue più di un resque worker in un Heroku Dyno?

Qualcuno sta facendo questo con successo finora? I miei pensieri sono, che un modo semplice per farlo sarebbe il caporeparto Procfile esegue, che quindi esegue 2 (o più) istanze del lavoratore effettivo (ad esempio rake resque:work)

O è rake resque:workers fino a tale attività? Resque stesso non consiglia l'utilizzo di tale metodo, in quanto questo avvia gli operatori in thread paralleli anziché in processi paralleli.

Ovviamente, questo ha senso solo sui lavori di rilegatura i/o.

risposta

8

Si può usare il caposquadra per avviare più processi. Aggiungere al caposquadra Gemfile, e quindi creare due file:

Procfile:

worker: bundle exec foreman start -f Procfile.workers 

Procfile.workers:

worker_1: QUEUE=* bundle exec rake resque:work 
worker_2: QUEUE=* bundle exec rake resque:work 

La stessa tecnica può essere utilizzata per eseguire un web server a fianco di alcuni lavoratori.

NOTA: mentre molti stati successo utilizzando questo approccio, non vorrei suggerire di usarlo al di fuori di alcuni esperimenti, soprattutto a causa del rischio di incorrere in limitazioni di RAM su piccole istanze di heroku; e una volta che si paga per il servizio di heroku è probabilmente più semplice girare semplicemente su una macchina worker dedicata.

+0

Impressionante! Ho appena usato questa stessa tecnica per avviare [più processi delayed_job su un singolo dyno worker] (http://stackoverflow.com/a/21568770/165673) – Yarin

+0

Heroku controlla i processi avviati dal file 'Procfile.workers'? Questo è il problema principale di non utilizzare l'impostazione 'COUNT = 2' di resque. – ajsharma

+0

Suppongo che se uno dei lavoratori muore, il caposquadra che esegue i "Procfile.workers" dovrebbe uccidere tutti i suoi figli e terminare se stesso - e questo dovrebbe quindi diventare visibile per heroku. Stavo eseguendo il setup di cui sopra per un po 'senza problemi, senza problemi, ma a un certo punto ho deciso di andare con le impostazioni predefinite di heroku. – radiospiel

1

Basato su this article, suona come è possibile, ma il più grande trucchetto è che se uno dei processi figlio muore, Heroku non sarà in grado di riavviarlo.

+0

Grazie per il vostro impegno. Ho trovato un modo che è più facile da costruire e probabilmente anche più stabile - vedi sopra – radiospiel