Node: runtime, event loop y como pensar rendimiento
Node: el runtime, el event loop y cómo pensar el rendimiento
Node.js es un entorno de ejecución de JavaScript construido sobre el motor V8 de Chrome. Su superpoder no es la velocidad bruta de cálculo, sino su modelo de concurrencia: un único hilo principal que nunca se queda esperando una operación de entrada/salida (leer un archivo, consultar una base de datos, llamar a otra API). En lugar de bloquearse, delega esas operaciones y sigue atendiendo otras peticiones. Por eso Node brilla en APIs con mucha I/O y muchas conexiones simultáneas.
El event loop en una frase
El event loop es el bucle que decide qué función se ejecuta a continuación cuando el hilo principal está libre. Hay dos colas que debes recordar: las macrotareas (como setTimeout o una operación de I/O completada) y las microtareas (las promesas resueltas, .then() y await). Las microtareas siempre se vacían por completo antes de pasar a la siguiente macrotarea.
Idea clave
- Trabajo de I/O (red, disco, base de datos): Node lo maneja sin esfuerzo.
- Trabajo de CPU (cifrar, comprimir, procesar imágenes): bloquea el único hilo y frena todas las peticiones.
Ejemplo: predice el orden de salida
console.log('1: start');
setTimeout(() => console.log('4: timer (macrotarea)'), 0);
Promise.resolve().then(() => console.log('3: microtarea'));
console.log('2: end');El orden real es 1, 2, 3, 4. Primero corre todo el código síncrono (1 y 2). Antes de tocar el setTimeout, el event loop vacía las microtareas (3). El temporizador (4) llega al final, aunque su retraso sea 0.
¿Qué tipo de tarea bloquea el hilo principal y degrada toda la API?
Ejercicio práctico
Objetivo: demostrar que entiendes el orden de ejecución y detectar trabajo CPU-bound.
- Crea un archivo
loop.jsy pega el snippet de arriba. Ejecútalo connode loop.jsy confirma el orden. - Añade un
queueMicrotask(() => console.log('otra microtarea'))y predice dónde aparece antes de correrlo. - Escribe una función con un bucle
forde 5.000 millones de iteraciones y mídela conconsole.time. Observa cómo congela el proceso.
Entregable: un archivo con tu predicción en comentarios y la salida real pegada debajo, más una frase explicando por qué el bucle pesado es peligroso en un handler HTTP.
Para recordar
- Node es un solo hilo: la I/O se delega, la CPU se queda.
- Las microtareas (promesas) se vacían antes de cada macrotarea.
- Nunca metas cálculos pesados en un handler; aíslalos en un worker o un servicio aparte.