Cierre correcto en NodeJS
En este artículo, le mostraré cómo hacer un apagado ordenado en una aplicación NodeJS, pero primero, describamos qué significa "cierre ordenado" y por qué necesitamos hacerlo en nuestra aplicación y cuáles son los beneficios.
Apagado elegante
Imaginemos que tiene un servidor HTTP con NodeJS conectado a una base de datos, y cada vez que se llama al servidor, envía una solicitud a la base de datos para obtener/establecer datos que también se enviarán al cliente mediante la respuesta.
Imagina que necesitas apagar el servidor. La forma más fácil de matar el servidor es <Ctrl>+C. Pero, ¿y si su servidor no terminó todas las solicitudes? ¿Qué pasa si algunas conexiones de clientes se cierran porque destruimos el servidor? Ya no podremos atender las solicitudes.
-Eso te da un punto para pensar, ¿no?
Como puede suponer, debe manejar todas las solicitudes y cerrar el procesamiento de todos los recursos en los datos (es decir, las conexiones de la base de datos) y no aceptar ninguna otra solicitud. Después de eso, puede apagar su servidor con la conciencia tranquila.
Cierre correcto : cuando todas sus solicitudes al servidor han recibido una respuesta y no queda trabajo de procesamiento de datos por realizar.
Es esencial crear un apagado correcto y apagar el servidor de la manera correcta. No puede saber qué puede pasar con las solicitudes realizadas al servidor. Cuando lo apaga de inmediato, puede cometer un error y matar el proceso, que está haciendo algo importante en este momento.
como funciona eso
Estos son los cuatro pasos para realizar rápidamente un apagado correcto.
- Manejar la señal de eliminación del proceso
- Detener nuevas solicitudes del cliente
- Cerrar todo el proceso de datos
- Salir del proceso
Vamos a crear un servidor NodeJS simple y hacer todos los pasos que mencioné anteriormente, lo que hará un apagado correcto cuando queramos cerrar el servidor y entender cómo funciona.
Aquí hay un ejemplo simple de servidor NodeJS usando ExpressJS
Aquí tenemos un servidor simple con una ruta que crea un usuario en MongoDB.
Podemos probar el servidor y crear un usuario en la base de datos usando este comando
curl -d ‘{ “username”: “Narek” }’ -H “Content-Type: application/json” -X POST http://localhost:3000/user
Si recibió un Success!mensaje, puede ver los datos JSON en MongoDB.
Ahora repasemos los cuatro pasos y escribamos el código apropiado.
1. Manejar la señal de eliminación del proceso
Primero, comprendamos qué es una señal de proceso.
Una señal es una notificación asincrónica enviada a un proceso oa un subproceso específico para notificar un evento que ocurrió.
Al emitir las señales, el proceso de NodeJS recibirá eventos.
Cada señal tiene un nombre (es decir 'SIGINT', 'SIGTERM', etc.), más sobre eso en NodeJS aquí .
'SIGINT'Generado al hacer clic<Ctrl>+Cen la terminal.- La
'SIGTERM'señal es una señal genérica utilizada para causar la terminación del programa. A diferencia de'SIGKILL'esto, las señales se pueden bloquear, manejar e ignorar. Es la forma estándar de pedirle a un programa que termine cortésmente. - El comando de shell
killgenera'SIGTERM'por defecto.
Como adivinas, necesitamos agregar un controlador para recibir una 'SIGTERM'señal.
Aquí está el siguiente ejemplo basado en el ejemplo anterior, que maneja la señal.
Ahora vamos a probar y probarlo.
Ejecute el servidor después de eso. Necesita obtener PIDel número, lo obtiene usando psel comando, así que ahora tiene el número y puede intentar eliminar el servidor usando este comando kill [PID_number]o simplemente killall nodeenviar una señal a todos los servidores de nodos. Después de ejecutar este comando, obtendrá este registro de las salidas del nodo
SIGTERM signal recived.
Si vuelve a intentarlo, obtendrá el mismo registro.
SIGTERM signal recived.
-Hmmm, ¿por qué no se mató el proceso?
Porque captaste la señal pero luego la ignoraste.
Entonces, hemos hecho lo primero. Pasemos al siguiente paso.
2. Detener nuevas solicitudes del cliente
Ahora debemos detener el servidor HTTP y dejar de aceptar nuevas solicitudes.
Podemos hacerlo usando la server.closefunción. Puede consultar el documento de NodeJS para obtener más información al respecto.
Entonces, el código se verá así.
Dejará de aceptar nuevas conexiones al servidor y su solicitud fallará si intenta llamar al servidor.
3. Cerrar todos los procesos de datos
En este ejemplo, el punto crítico es cerrar la conexión MongoDB porque no quedan solicitudes.
Entonces, así es como podemos cerrar la conexión sin mantener ninguna activa.
-Hmmmmmmm, ¿por qué el servidor del nodo se cierra después de que se cierra la conexión de la base de datos?
Es una pregunta interesante, puedes tratar de entender ese punto por ti mismo, pero si no puedes o no quieres, lo describiré en el próximo capítulo.
4. Cerrar todos los procesos de datos
Como ha visto, nuestra aplicación sale de una conexión de base de datos cercana.
¿Cual es la causa? -Evento de bucle
Como sabemos, NodeJS saldrá cuando la cola de EventLoop esté vacía y no quede nada por hacer.
Pero a veces, su aplicación puede tener más funciones y no se cerrará automáticamente. En este punto llega nuestro último trabajo por hacer.
Necesitamos salir del proceso usando process.exitla función.
Y el ejemplo final del servidor de apagado elegante se verá así.
Argumento 0significa salir con un código de "éxito" .
Para salir con un código de "fallo", use 1.
Para obtener este código de salida después del apagado, ejecute este comando en la terminal donde ejecuta su servidor de nodo.
echo $?
De forma predeterminada, NodeJS sale con el código de proceso 0si EventLoop está vacío.
¡Eso es todo!
Resumen
No es la única forma de apagar el servidor correctamente. Pero es una implementación simple que funcionará bien en proyectos pequeños. Para algunos proyectos grandes, lo más probable es que necesite equilibrar el servidor (es decir, Nginx). Podemos equilibrar la carga y no enviar una solicitud para apagar el servidor.
Gracias, siéntase libre de hacer cualquier pregunta o enviarme un tweet a @nairihar .
En mi artículo sobre " NodeJS Health Checks and Overload Protection "
https:///@nairihar/nodejs-health-checks-and-overload-protection-368a132a725e

![¿Qué es una lista vinculada, de todos modos? [Parte 1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































