"Si un trabajador quiere hacer bien su trabajo, primero debe afilar sus herramientas." - Confucio, "Las Analectas de Confucio. Lu Linggong"
Página delantera > Programación > Escalar Node.js con el módulo de clúster

Escalar Node.js con el módulo de clúster

Publicado el 2024-11-04
Navegar:933

Scaling Node.js with the Cluster Module

El módulo Cluster permite a Node.js aprovechar los sistemas multinúcleo, mejorando el rendimiento de la aplicación. Exploremos cómo usarlo de manera efectiva.

¿Por qué agruparse?

  1. Utilizar todos los núcleos de CPU
  2. Mejorar la capacidad de respuesta de la aplicación
  3. Aumentar la confiabilidad mediante el despido de trabajadores

Uso básico

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

if (cluster.isMaster) {
  console.log(`Master ${process.pid} is running`);

  // Fork workers
  for (let i = 0; i  {
    console.log(`Worker ${worker.process.pid} died`);
  });
} else {
  // Workers can share any TCP connection
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello World\n');
  }).listen(8000);

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

Equilibrio de carga

Node.js maneja el equilibrio de carga automáticamente mediante un enfoque de operación por turnos.

Comunicación entre procesos (IPC)

if (cluster.isMaster) {
  const worker = cluster.fork();
  worker.send('Hi there');
} else {
  process.on('message', (msg) => {
    console.log('Message from master:', msg);
  });
}

Reinicios sin tiempo de inactividad

if (cluster.isMaster) {
  cluster.on('exit', (worker, code, signal) => {
    if (!worker.exitedAfterDisconnect) {
      console.log('Worker crashed. Starting a new worker');
      cluster.fork();
    }
  });

  process.on('SIGUSR2', () => {
    const workers = Object.values(cluster.workers);
    const restartWorker = (workerIndex) => {
      const worker = workers[workerIndex];
      if (!worker) return;

      worker.on('exit', () => {
        if (!worker.exitedAfterDisconnect) return;
        console.log(`Exited process ${worker.process.pid}`);
        cluster.fork().on('listening', () => {
          restartWorker(workerIndex   1);
        });
      });

      worker.disconnect();
    };

    restartWorker(0);
  });
}

Mejores prácticas

  1. Utilice Workers_threads para tareas que requieren un uso intensivo de la CPU
  2. Implementar un manejo adecuado de errores en los trabajadores
  3. Supervisar la salud de los trabajadores y reiniciar si es necesario
  4. Utilice un administrador de procesos como PM2 para producción

Errores a evitar

  1. El servidor compartido maneja explícitamente (Node.js lo hace automáticamente)
  2. Uso excesivo de IPC (puede convertirse en un cuello de botella)
  3. Negligencia en gestionar los accidentes laborales

El módulo Cluster es potente para el escalado horizontal, pero utilícelo con prudencia. Perfile siempre para asegurarse de que resuelva sus necesidades de rendimiento específicas.

¿Salud?

Declaración de liberación Este artículo se reproduce en: https://dev.to/sarvabharan/scaling-nodejs-with-the-cluster-module-5dm9?1 Si hay alguna infracción, comuníquese con [email protected] para eliminarla.
Último tutorial Más>

Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.

Copyright© 2022 湘ICP备2022001581号-3