Clusters y procesos hijos
Clase 16 de 48 • Curso 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.