«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Масштабирование Node.js с помощью модуля кластера

Масштабирование Node.js с помощью модуля кластера

Опубликовано 4 ноября 2024 г.
Просматривать:787

Scaling Node.js with the Cluster Module

Модуль Cluster позволяет Node.js использовать многоядерные системы, повышая производительность приложений. Давайте посмотрим, как его эффективно использовать.

Почему кластер?

  1. Использовать все ядра процессора
  2. Улучшите скорость реагирования приложения
  3. Повысьте надежность за счет резервирования сотрудников

Основное использование

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

Балансировка нагрузки

Node.js автоматически распределяет нагрузку, используя циклический подход.

Межпроцессное взаимодействие (IPC)

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

Перезапуск с нулевым временем простоя

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

Лучшие практики

  1. Используйте worker_threads для задач, интенсивно использующих процессор
  2. Реализовать правильную обработку ошибок в рабочих процессах
  3. Отслеживать состояние работника и при необходимости перезапускать его
  4. Используйте для производства менеджер процессов, например PM2

Ловушки, которых следует избегать

  1. Явное совместное использование дескрипторов сервера (Node.js делает это автоматически)
  2. Чрезмерное использование IPC (может стать узким местом)
  3. Пренебрежение устранением сбоев рабочих

Модуль кластера отлично подходит для горизонтального масштабирования, но используйте его с умом. Всегда выполняйте профилирование, чтобы убедиться, что оно соответствует вашим конкретным потребностям в производительности.

Ваше здоровье?

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/sarvabharan/scaling-nodejs-with-the-cluster-module-5dm9?1. Если есть какие-либо нарушения, свяжитесь с [email protected], чтобы удалить их.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3