"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Escalando Node.js com o Módulo Cluster

Escalando Node.js com o Módulo Cluster

Publicado em 2024-11-04
Navegar:921

Scaling Node.js with the Cluster Module

O módulo Cluster permite que o Node.js aproveite sistemas multi-core, melhorando o desempenho do aplicativo. Vamos explorar como usá-lo de forma eficaz.

Por que agrupar?

  1. Utilize todos os núcleos da CPU
  2. Melhorar a capacidade de resposta do aplicativo
  3. Aumente a confiabilidade por meio da redundância de trabalhadores

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`);
}

Balanceamento de carga

Node.js lida com o balanceamento de carga automaticamente usando uma abordagem round-robin.

Comunicação entre processos (IPC)

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

Reinicializações sem tempo de inatividade

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);
  });
}

Melhores Práticas

  1. Use work_threads para tarefas com uso intensivo de CPU
  2. Implementar tratamento adequado de erros em trabalhadores
  3. Monitore a saúde do trabalhador e reinicie se necessário
  4. Use um gerenciador de processos como PM2 para produção

Armadilhas a evitar

  1. O servidor de compartilhamento trata explicitamente (o Node.js faz isso automaticamente)
  2. Uso excessivo de IPC (pode se tornar um gargalo)
  3. Negligência no tratamento de falhas de trabalhadores

O módulo Cluster é poderoso para escalonamento horizontal, mas use criteriosamente. Sempre crie um perfil para garantir que ele esteja resolvendo suas necessidades específicas de desempenho.

Saúde?

Declaração de lançamento Este artigo foi reproduzido em: https://dev.to/sarvabharan/scaling-nodejs-with-the-cluster-module-5dm9?1 Se houver alguma violação, entre em contato com [email protected] para excluí-la
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3