Detener, esperar y restablecer correctamente un proceso de node.js heroku

Todavía no lo he implementado, pero no estoy seguro de cómo hacerlo.

Tengo una aplicación que utiliza muchos procesos de fondo. Es decir, incluso después de que se envía una respuesta, todavía hay funciones asociadas con esa respuesta que se ejecuta en segundo plano. Por lo tanto, quiero hacer algo como esto:

var server = http.createServer(app).listen(80) process.on('SIGINT', function () { server.close() setTimeout(function () { process.exit() }, 30000) // Wait 30 seconds before exiting }) 

No estoy seguro de si esto es correcto o no. Más suposiciones:

  • Estos procesos de fondo son cruciales. Sin embargo, probablemente tomarán 1-2 segundos, no 30 segundos. Aún así, quiero poner un retraso de 30 segundos solo por seguridad.
  • Esto debería funcionar tanto para reiniciar el proceso (digamos, para siempre) como para detener el proceso.
  • ¿Qué señales envía Heroku (o cualquier otro proceso) a node.js a través del process ? ¿Tendría que manejarlos de manera diferente?
  • ¿ uncaughtException diferente?

Gracias

Lo tengo. Heroku envía una señal SIGTERM cuando se apaga. Si el proceso no sale en 10 segundos, envía una señal SIGKILL . Por lo tanto, lo siguiente es suficiente:

 process.on('SIGTERM', server.close.bind(server)) 

https://devcenter.heroku.com/articles/dynos#graceful-shutdown-with-sigterm

Asumir 10 segundos es suficiente para que se completen los procesos en segundo plano.

Básicamente, envíe una señal de “cierre” x segundos antes de una señal de “salida” y debe estar en buenas condiciones.

Creo que es mejor que utilices un proceso de trabajo para hacer esos trabajos de fondo (dino de trabajo en Heroku).

esto libera a su servidor web para que sirva a sus usuarios lo más rápido posible y le permite tener un mejor control al escalar (por ejemplo, ejecutando 3 dinámicas web y 2 dinámicas de trabajadores).

puede usar la funcionalidad de publicación / sub de Redis para enviar trabajos al trabajador (o usar una biblioteca para hacerlo, como http://learnboost.github.com/kue/ ).

de esta manera, cuando un dinamómetro web se reinicia / muere / etc .. no tiene ningún efecto en los trabajos en segundo plano pendientes y cuando un dinamómetro trabajador se reinicia solo consumirá los trabajos pendientes y los procesará, por lo que no perderá ningún trabajo debido al reinicio.