ホームページ  >  記事  >  ウェブフロントエンド  >  クラスターモジュールを使用した Node.js のスケーリング

クラスターモジュールを使用した Node.js のスケーリング

DDD
DDDオリジナル
2024-09-19 22:30:03861ブラウズ

Scaling Node.js with the Cluster Module

Cluster モジュールを使用すると、Node.js でマルチコア システムを活用できるようになり、アプリのパフォーマンスが向上します。効果的な使用方法を検討してみましょう。

なぜクラスターなのか?

  1. すべての CPU コアを使用します
  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 < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    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. CPU を集中的に使用するタスクには worker_threads を使用します
  2. ワーカーに適切なエラー処理を実装する
  3. 従業員の健康状態を監視し、必要に応じて再起動します
  4. 本番環境には PM2 などのプロセス マネージャーを使用します

避けるべき落とし穴

  1. サーバー ハンドルを明示的に共有する (Node.js がこれを自動的に実行します)
  2. IPC の過剰使用 (ボトルネックになる可能性があります)
  3. ワーカーのクラッシュへの対処を怠った

Cluster モジュールは水平方向のスケーリングに強力ですが、慎重に使用してください。常にプロファイリングを行って、特定のパフォーマンスのニーズを確実に解決していることを確認してください。

乾杯?

以上がクラスターモジュールを使用した Node.js のスケーリングの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。