Básicamente, estoy construyendo un servidor express y recientemente investigué el tema de escalar aplicaciones NodeJS. Una de las primeras cosas que vi fue el módulo de cluster incorporado para aprovechar todos los subprocesos del procesador de la máquina. Aquí está mi código de la implementación que he hecho:
import cluster from "cluster"; import { cpus } from "os"; import dotenv from "dotenv"; dotenv.config(); import express, { Express } from "express"; import log from "./logger"; import database from "./database"; import router from "./router"; const app: Express = express(); // Middleware app.use(express.json()); app.use(express.urlencoded({ extended: false })); const port = <number>(<unknown>process.env.PORT); const host = <string>process.env.HOST; const numCPU = cpus().length; if (cluster.isPrimary) { for (let i = 0; i < numCPU; i++) { cluster.fork(); } cluster.on("listening", (worker) => { // Not printing anything console.log(worker.process.pid); }); cluster.on("exit", (worker, code, signal) => { log.error(`Worker ${worker.process.pid} died. Starting a new worker...`); cluster.fork(); }); } else { app.listen(port, host, () => { // Only prints this once. log.info(`Server ${process.pid} listening at http://${host}:${port}`); database(); router(app); }); } El problema es que el bloque cluster.isPrimary nunca se ejecuta , lo que significa, por supuesto, que el clúster no bifurca ningún otro proceso. Sin embargo, cuando uso cluster.isMaster , todo funciona exactamente como se esperaba. Pero dado que isMaster está en desuso y se reemplaza por isPrimary, eso es lo que estoy tratando de usar, pero simplemente no funciona.
Soluciones que he probado que no funcionan:
¿Qué estoy haciendo mal?
Lo más probable es que sea la versión del nodo que está ejecutando. isPrimary solo está disponible en las versiones 16+ y lo más probable es que tenga la versión LTS que es v14