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 actualconst 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 CPUSfor(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.jsMaster3596 is running
Worker4324 started
Worker4520 started
Worker6056 started
Worker5644 started
En Windows, todavía no es posible establecer un nombre de proceso server en un worker.