¿Cómo manejar la concurrencia en Node.js?

Node.js es un entorno de tiempo de ejecución multiplataforma de código abierto creado en el motor V8 de Chrome. Se utiliza para desarrollar backend altamente escalable, así como aplicaciones del lado del servidor.

Node.js utiliza una arquitectura de bucle de eventos de subproceso único. También es de naturaleza asíncrona. Estas son las dos razones principales por las que node.js puede manejar fácilmente múltiples requests simultáneas y por las que se convierte en una opción obvia para el desarrollo de tales aplicaciones.

Funcionamiento de Node.js

Funcionamiento de Node.JS

Node.js funciona de forma asíncrona . En otras palabras, no bloquea las requests entrantes de los clientes cuando el sistema operativo tiene una solicitud intensiva de E/S. En su lugar, pasa esta solicitud de E/S a los subprocesos internos de C++ y toma el siguiente trabajo de la cola de eventos.

Nota: Los subprocesos internos de C++ pueden o no ser uno, pero eso no es motivo de preocupación aquí.

La cola de eventos no es más que una cola que almacena las requests entrantes en el orden en que las recibió. Luego pasa estas requests al bucle de eventos cuando está disponible. Para cada solicitud de E/S, el bucle de eventos la recibe, la pasa a los subprocesos internos de C++ para que la procesen, se pone a disposición de las demás requests y comienza a procesarlas. Luego, utiliza el concepto de funciones de devolución de llamada de JavaScript para recibir las respuestas de las tareas que se enviaron anteriormente a los subprocesos internos de C++ para su procesamiento y las entrega al cliente.

Entendamos esto con un ejemplo:

Ejemplo 1: Arquitectura Web Tradicional

Javascript

function func() {
    console.log("Hey I am Line number 1");
    setTimeout(function () {
        console.log("Hey I am Line number 2");
    }, 2000);
    console.log("Hey I am Line number 3");
}
console.log("Hey I am Line number 4");
  
func();

Aquí, tenemos 4 declaraciones de console.log() en el orden de 1 a 4. Asumiendo que se trata de una aplicación basada en arquitectura tradicional, el resultado se vería así.

Producción:

Hey I am Line number 4
Hey I am Line number 1
Hey I am Line number 2
Hey I am Line number 3

Explicación: aquí, el «Hola, soy la línea número 4» se ejecutará primero, ya que está encima de la llamada de función. Después de eso, se llamará a la función. Luego se imprimirá «Hola, soy la línea número 1» y la aplicación entrará en un tiempo de espera de 2 segundos (2000 ms) y luego imprimirá «Hola, soy la línea número 2» y «Hola, soy la línea número 3», respectivamente.

Ejemplo 2: Aplicación Node.js

Javascript

function func() {
    console.log("Hey I am Line number 1");
    setTimeout(function () {
        console.log("Hey I am Line number 2");
    }, 2000);
    console.log("Hey I am Line number 3");
}
console.log("Hey I am Line number 4");
func();

Aquí, tenemos 4 declaraciones de console.log() en el orden 1 a 4. Suponiendo que se trata de una aplicación sin bloqueo de un solo subproceso, el resultado se vería así.

Producción:

Hey I am Line number 4
Hey I am Line number 1
Hey I am Line number 3
Hey I am Line number 2

Explicación: aquí, el «Hola, soy la línea número 4» se ejecutará primero, ya que está encima de la llamada de función. Después de eso, se llamará a la función. Luego, se imprimirá “Hola, soy la línea número 1” y la aplicación entrará en un tiempo de espera debido a la llamada de función, durante 2 segundos (2000 ms). Ahora, cuando la aplicación espera 2 segundos, no bloqueará más requests, sino que procesará la siguiente solicitud y, por lo tanto, imprimirá «Hola, soy la línea número 3». Una vez que finaliza el tiempo de espera, las líneas ahora se ejecutarán y se imprimirá «Hola, soy la línea número 2» en la consola.

De esta forma, el bucle de eventos nunca queda ocupado o bloqueado por una solicitud en particular. Esto es lo que le da a Node.js una ventaja competitiva sobre los servidores web tradicionales en términos de manejo de múltiples requests de usuarios al mismo tiempo, es decir, concurrencia.

Publicación traducida automáticamente

Artículo escrito por jaygala260 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *