Cómo Node.js maneja miles de solicitudes
La gente dice que Node.js es de un solo hilo (single-threaded).
Sin embargo, maneja miles de solicitudes, lee archivos y realiza llamadas a APIs sin detenerse.
¿Cómo funciona?
La respuesta es libuv.
libuv es una biblioteca de C. Le otorga a Node.js capacidades de E/S (I/O) asíncronas y no bloqueantes. JavaScript no puede leer archivos ni gestionar sockets de red por sí mismo. Node.js utiliza libuv para comunicarse con tu sistema operativo.
Sin libuv, JavaScript se detendría cada vez que leyeras un archivo. Tu aplicación dejaría de responder.
Con libuv, la lectura del archivo se realiza en segundo plano. JavaScript continúa ejecutando otro código.
Ejemplo:
console.log("Start");
fs.readFile("data.txt", "utf8", (err, data) => {
console.log(data);
});
console.log("End");
Salida: Start End (contenido del archivo)
Node.js imprime "End" antes de que termine la lectura del archivo. No espera.
Cómo libuv gestiona tu código:
• El Event Loop: libuv ejecuta el bucle que comprueba si las tareas han terminado. Coloca los callbacks en una cola cuando las tareas se completan. • Thread Pool: JavaScript utiliza un solo hilo. libuv utiliza un pool de hilos de trabajo. Por defecto, este pool tiene 4 hilos. Estos hilos gestionan tareas pesadas como:
- Operaciones del sistema de archivos
- Búsquedas de DNS
- Compresión
- Criptografía • Networking: libuv gestiona sockets HTTP, TCP y UDP. Esto permite que los servidores manejen muchas conexiones a la vez. • Timers: libuv gestiona setTimeout y setInterval.
El flujo de ejecución funciona así:
- JavaScript ejecuta tu código.
- libuv lleva las tareas pesadas al segundo plano.
- JavaScript continúa con la siguiente línea.
- libuv notifica al Event Loop cuando la tarea ha terminado.
- El Event Loop ejecuta tu callback.
Imagina una pizzería.
Sin libuv, te paras en el mostrador y preguntas "¿Está lista mi comida?" cada diez segundos. Bloqueas la fila.
Con libuv, haces tu pedido, te sientas y esperas una notificación. Eres libre de hacer otras cosas hasta que la pizza esté lista.
Resumen:
• Ejecución de JavaScript: V8 Engine • Event Loop: libuv • E/S de archivos: libuv • Red: libuv • Timers: libuv
libuv es el motor que hace que Node.js sea rápido.
