2015-05-07 21 views
15

L'interfaccia web resque predefinita dice che ho 5 lavoratori su 7 che lavorano. Non capisco come potrebbe accadere.Come controllare lo stato di Resque worker per determinare se è morto o stantio

Sono su heroku, quindi quando il mio banco di avviamento si riavvia, dovrebbe ruotare i dynos e gli operai esistenti, quindi avviare quelli nuovi. Quindi, presumo che alcuni di questi lavoratori siano obsoleti, ma resque pensa che ci siano così tanti lavoratori in più rispetto a quelli che dovrebbero essere ... (ci dovrebbe essere solo 1)

Come posso verificare se qualcuno di questi sia stantio o morto? Mi aspetto di vedere lavorare solo 1 lavoratore.

Alla fine, mi aspetto farò tutto quello presente SO messaggio dice: How do I clear stuck/stale Resque workers?, ma prima mi piacerebbe sapere come determinare se un lavoratore deve essere rimosso ... Io non voglio ciecamente unregister lavoratori ...

Scusa se questa è una domanda ovvia. Sono nuovo per resque.

Grazie!

+0

Fare riferimento a questo http: //www.rubydoc.info/gems/resque/Resque/Worker .... – Milind

+1

Come ho accennato nella domanda, so già che Internet sembra pensare che la soluzione definitiva al mio problema sia (chiamando 'unregister_worker'). Non mi è chiaro il motivo per cui non controlleresti se è possibile annullare la registrazione del worker prima di eseguire effettivamente questo codice. Cosa succede se un lavoratore è attualmente in esecuzione quando lo esegui? Quali sono gli effetti collaterali del cieco chiamato 'unregister_worker'? – user5243421

+0

Inoltre, non aiuta semplicemente a collegarmi a tutti i documenti del lavoratore. Chiaramente non capisco da dove cominciare. Quale metodo dovrei fare riferimento qui? – user5243421

risposta

8

L'unico modo per determinare se un lavoratore è in realtà di lavoro è quello di verificare sulla macchina host del lavoratore. Dopo un riavvio su Heroku, queste macchine non esistono più, quindi se il lavoratore non si fosse annullato la registrazione, Resque crederà che continui a funzionare. La natura decentralizzata dei lavoratori Resque significa che non è possibile controllare facilmente lo stato effettivo dei lavoratori. Quando ogni lavoratore viene avviato, si registra con i redis. Quando quel lavoratore riprende un lavoro e inizia a lavorarlo di nuovo registra lo stato con redis. Quando si scorre in questo modo:

Resque.workers.each { |w| w.working? } 

si sta tirando un elenco dei lavoratori Redis e controllando l'ultimo stato registrato di quei Redis forma lavoratori. In realtà non esegue una query sul lavoratore stesso.

I nomi degli host nel display resque-web corrisponderanno con i nomi visualizzati nell'output del registro heroku, quindi non è un ottimo modo per vedere cosa è effettivamente in esecuzione. Speravo che si potesse automatizzare usando gli ID Dyno ottenuti dall'API della piattaforma, ma non corrispondono ai nomi degli host.

Assicurarsi di utilizzare con garbo Resque::TermException come specificato in this document. Puoi anche esaminare alcuni degli aspetti heartbeat solutions che hanno risolto questo problema. Ho avuto problemi in cui anche l'utilizzo di TERM_CHILD e la corretta gestione del segnale lascia fluttuare i lavoratori stantii. La mia soluzione è stata quella di attendere fino a quando nessun lavoro è stato elaborato, annullare la registrazione di tutti i lavoratori, quindi riavviare con heroku ps:restart worker.

+0

Questa è un'ottima risposta. La cosa con la mia situazione è che ci sono molti lavoratori che lavorano tutto il tempo per la mia app.Non è una valida opzione aspettare fino a quando non vengono elaborati lavori, ma grazie per la risposta! – user5243421

3

Prova questo:

Resque.workers.each do |w| 
    if w.processing['run_at'] && Time.now - w.processing['run_at'].to_time > 7.days 
    w.unregister_worker 
    end 
end 
+0

Questa potrebbe essere la risposta migliore che posso ottenere. I lavoratori stanti continuano a pensare che stiano lavorando su qualcosa, quindi non posso davvero usare normali flag come 'processing' o' working? '... – user5243421