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:
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.