Clusters y procesos hijos

Clase 16 de 48Curso de Backend con Node.js 2019

Una sola instancia de Node.js corre un solo hilo de ejecución. Para tomar ventaja de los sistemas con multiples core, necesitamos lanzar un cluster de procesos de Node.js para manejar la carga.

El módulo cluster nos permite la creación fácil de procesos hijos que comparten el mismo puerto del servidor. Veamos un ejemplo en código:

const cluster = require("cluster"); const http = require("http"); // Requerimos la cantidad de CPUs que tiene la maquina actual const numCPUs = require("os").cpus().length; if (cluster.isMaster) { console.log(`Master ${process.pid} is running`); // Si el cluster es maestro, creamos tantos procesos como numero de CPUS for (let i = 0; i < numCPUs; i++) { cluster.fork(); } // Si por alguna razón el cluster se finaliza hacemos un log cluster.on("exit", (worker, code, signal) => { console.log(`worker ${worker.process.pid} died`); }); } else { // Los diferentes workers pueden compartir la conexión TCP // En este caso es una servidor HTTP http .createServer((req, res) => { res.writeHead(200); res.end("hello world\n"); }) .listen(8000); console.log(`Worker ${process.pid} started`); }

Si corremos nuestro archivo de Node.js ahora compartirá el puerto 8000 con los diferentes workers:

$ node server.js Master 3596 is running Worker 4324 started Worker 4520 started Worker 6056 started Worker 5644 started

En Windows, todavía no es posible establecer un nombre de proceso server en un worker.