Módulo Cluster de Node.js

Java FileMódulos integrados de Node.js


El módulo de Node.jsclusterte permite crear fácilmente procesos hijos (worker processes) que comparten el mismo puerto del servidor. Dado que Node.js es de un solo hilo,clusterel módulo puede ayudarnos a aprovechar al máximo el rendimiento de los sistemas con CPU multinúcleo.

En pocas palabras,clusterel módulo es como el gerente de un restaurante: crea varios camareros (workers) para atender a los clientes (solicitudes), en lugar de dejar que un solo camarero atienda a todos los clientes.


¿Por qué se necesita el módulo Cluster?

  1. Mejorar el rendimiento: las CPU modernas normalmente tienen varios núcleos, pero Node.js solo usa un núcleo por defecto.clusterEl módulo te permite utilizar todos los núcleos de CPU disponibles.

  2. Mejorar la fiabilidad: si un worker falla, otros workers pueden seguir procesando solicitudes, y el proceso principal puede reiniciar el worker que falló.

  3. Cero tiempo de inactividad: se pueden reiniciar los workers uno por uno para implementar actualizaciones de código sin interrumpir el servicio.


Uso básico del módulo Cluster

Ejemplo

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`Proceso principal ${process.pid}en ejecución`);

  // Generar procesos worker
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`worker ${worker.process.pid}ha salido`);
  });
} else {
  // Los workers pueden compartir la misma conexión TCP
  // Aquí hay un servidor HTTP
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hola mundo\n');
  }).listen(8000);

  console.log(`Worker ${process.pid}iniciado`);
}

Explicación de los conceptos principales

Proceso principal (Master Process)

  • Se encarga de gestionar todos los procesos worker
  • Normalmente no procesa solicitudes reales
  • Puede escuchar varios eventos de los workers

Proceso Worker

  • El proceso hijo que realmente procesa las solicitudes
  • Cada worker es un proceso Node.js independiente
  • Comparten el mismo puerto del servidor

API comunes del módulo Cluster

cluster.fork()

Crea un nuevo proceso worker. Llamar a este método devuelve un objeto worker.

cluster.isMaster

Si es el proceso principal, entonces estrue。

cluster.isWorker

Si es un proceso worker, entonces estrue。

cluster.workers

Una tabla hash que contiene todos los objetos worker activos, que utilizaworker.idcomo clave.


Escenarios de aplicación prácticos

1. Equilibrio de carga

Ejemplo

// En el proceso principal
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }
} else {
  require('./app'); // Tu archivo de entrada de la aplicación
}

2. Reinicio elegante

Ejemplo

cluster.on('exit', (worker, code, signal) => {
  console.log(`Worker ${worker.process.pid}salir`);
  // Aquí se puede volver a hacer fork de un nuevo worker
  cluster.fork();
});

3. Comunicación entre procesos

Ejemplo

// El proceso principal envía un mensaje
worker.send('Hello worker!');

// El worker recibe el mensaje
process.on('message', (msg) => {
  console.log(`Worker ${process.pid}Mensaje recibido: ${msg}`);
});

Consejos de optimización del rendimiento

  1. Crear workers según el número de núcleos de la CPU: normalmente se recomienda que el número de workers sea igual al número de núcleos de la CPU.

  2. Compartir puerto: todos los workers comparten el mismo puerto, y el sistema operativo distribuye automáticamente las solicitudes a los diferentes workers.

  3. Compartir conexión: para conexiones de larga duración (como WebSocket), se debe considerar cómo asignar las conexiones a los diferentes workers.

  4. Compartir estado: los workers no comparten memoria; se necesita usar almacenamiento externo como Redis para compartir el estado.


Problemas comunes y soluciones

1. Fuga de memoria

Cada worker es un proceso independiente; una fuga de memoria en un worker no afecta a los demás, pero es necesario monitorear y reiniciar los workers anómalos.

2. Persistencia de sesión

Si se necesita persistencia de sesión, se puede usar una sesión adhesiva (sticky session) o almacenar los datos de sesión externamente (como en Redis).

3. Límite de descriptores de archivo

Una gran cantidad de workers puede agotar los descriptores de archivo; es necesario ajustar los límites del sistema:

Ejemplo

ulimit -n 10000  # Establecer el límite de descriptores de archivo

Alternativas al módulo Cluster

Aunqueclusterel módulo es muy potente, también hay otras opciones:

  1. PM2: administrador de procesos, con equilibrio de carga y monitoreo integrados
  2. Nginx: proxy inverso, puede equilibrar la carga entre múltiples instancias de Node.js
  3. Kubernete: sistema de orquestación de contenedores, puede escalar automáticamente los servicios de Node.js

Resumen

El módulo de Node.jsclusteres una herramienta importante para construir servicios de red de alto rendimiento y alta disponibilidad. Al crear múltiples procesos worker, podemos:

  1. Aprovechar al máximo el rendimiento de las CPU multinúcleo
  2. Mejorar la fiabilidad de la aplicación
  3. Lograr despliegues con cero tiempo de inactividad

Aunque configurar y gestionar aplicaciones multiproceso es más complejo que con un solo proceso, para aplicaciones Node.js en entornos de producción, usarclusterel módulo o soluciones similares es casi imprescindible.

Espero que esta guía te ayude a comprender y utilizar elclustermódulo de Node.js!

Java FileMódulos integrados de Node.js

Otras extensiones