rails ruby-on-rails ruby-on-rails-3 heroku redis resque

ruby-on-rails - rails - heroku dash



Cómo verificar el estado del trabajador de Resque para determinar si está muerto o obsoleto (2)

La interfaz web de resque por defecto dice que tengo 5 de 7 trabajadores trabajando. No entiendo cómo esto podría estar sucediendo.

Estoy en Heroku, así que cuando mi dinamómetro se reinicie, debería reducir los actuales y los trabajadores, y luego los nuevos. Entonces, asumo que algunos de estos trabajadores están obsoletos, pero Resque cree que hay muchos más trabajadores trabajando de los que debería haber ... (solo debería haber 1)

¿Cómo puedo comprobar si alguno de estos está obsoleto o muerto? Espero ver a solo 1 trabajador trabajando.

Eventualmente, espero que haga lo que diga este post de SO: ¿Cómo elimino los trabajadores de Resque atascados / obsoletos? , pero primero me gustaría saber cómo determinar si un trabajador debe ser removido ... No quiero dar de baja ciegamente a los trabajadores ...

Disculpas si esta es una pregunta obvia. Soy nuevo para resque.

¡Gracias!


La única manera de determinar si un trabajador está realmente trabajando es verificar en la máquina host del trabajador. Después de reiniciar Heroku, estas máquinas ya no existen, por lo tanto, si el trabajador no se dio de baja, Resque considerará que aún funciona. La naturaleza descentralizada de los trabajadores de Resque significa que no puede verificar fácilmente el estado real de los trabajadores. Cuando se arranca cada operario se registra con redis. Cuando ese trabajador retoma un trabajo y comienza a trabajar nuevamente, registra su estado con redis. Cuando iteras así:

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

está sacando una lista de trabajadores de redis y verificando el último estado registrado de los trabajadores que forman redis. En realidad, no consulta al propio trabajador.

Los nombres de host en la pantalla de red de búsqueda coincidirán con los nombres que se ven en la salida del registro de heroku, por lo que no es una buena forma de ver qué se está ejecutando. Tenía la esperanza de que uno pudiera automatizar mediante el uso de los identificadores dinámicos obtenidos de la plataforma API, pero no coinciden con los nombres de host.

Asegúrese de que está manejando con gracia Resque::TermException como se especifica en este documento . También puede analizar algunas de las soluciones de latido del corazón que otros han ideado para solucionar este problema. He tenido problemas en los que incluso el uso de TERM_CHILD y el manejo adecuado de la señal dejan a los trabajadores obsoletos flotando alrededor. Mi solución ha sido esperar hasta que no se estén procesando los trabajos, anular el registro de todos los trabajadores y luego reiniciar con heroku ps:restart worker .


Prueba esto:

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