「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Node.js アプリケーションのスケーリング: テクニック、ツール、ベスト プラクティス

Node.js アプリケーションのスケーリング: テクニック、ツール、ベスト プラクティス

2024 年 11 月 7 日に公開
ブラウズ:706

Scaling Node.js Applications: Techniques, Tools, and Best Practices

Node.js アプリケーションが成長するにつれて、より優れたパフォーマンスとスケーラビリティに対する要求が高まります。 Node.js は大規模なデータ集約型アプリケーションを処理するように設計されていますが、負荷がかかった状態でパフォーマンスと可用性を維持するには、適切にスケーリングする方法を理解することが重要です。この記事では、Node.js アプリケーションを効果的に拡張するための主要なテクニックとツールについて説明します。

Node.js アプリケーションをスケールする理由

スケーリングとは、ユーザー ベースの増加、データの増加、トラフィックの増加などによる負荷の増加を処理するアプリケーションの能力を指します。スケーリングを行わないと、アプリケーションはパフォーマンスの低下、ダウンタイム、リソースの非効率に直面する可能性があります。

2 種類のスケーリング

  1. 垂直スケーリング: 単一サーバーにさらに多くの電力 (CPU、RAM) を追加します。これによりサーバーの容量は増加しますが、物理的な制限があります。

  2. 水平スケーリング: サーバーを追加して負荷を分散すること。一般に「スケールアウト」と呼ばれます。この方法はより柔軟であり、大規模なシステムでよく使用されます。

Node.js アプリケーションをスケーリングするための主要なテクニック

1. ロードバランシング

負荷分散は、受信トラフィックを複数のサーバーに分散して、単一のサーバーが過負荷にならないようにする方法です。これは、Node.js アプリケーションの複数のインスタンスが実行されている水平スケーリングにおいて特に重要です。

例: 負荷分散に NGINX を使用する

http {
    upstream node_servers {
        server 127.0.0.1:3000;
        server 127.0.0.1:3001;
        server 127.0.0.1:3002;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://node_servers;
        }
    }
}

説明

  • 上流ブロックは複数の Node.js インスタンスを定義します。
  • 受信リクエストはインスタンス間で分散され、パフォーマンスが向上します。

2. クラスタリング

Node.js はシングルスレッドですが、Cluster モジュールを使用すると、同じサーバー ポートを共有する子プロセスを作成することで複数の CPU コアを利用できます。

例: クラスター モジュールの使用

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

if (cluster.isMaster) {
    // Fork workers.
    for (let i = 0; i  {
        console.log(`Worker ${worker.process.pid} died`);
    });
} else {
    // Workers can share the same port
    http.createServer((req, res) => {
        res.writeHead(200);
        res.end('Hello World');
    }).listen(8000);
}

説明

  • マスター プロセスは、CPU コアの数に等しいワーカー プロセスを作成します。
  • 各ワーカーは受信リクエストを処理し、負荷を効率的に分散します。

3. キャッシング

キャッシュは、頻繁に要求されるデータをデータベースから再フェッチしたり結果を再計算したりするのではなく、メモリに保存することで応答時間を短縮し、負荷を軽減します。

例: キャッシュに Redis を使用する

const redis = require('redis');
const client = redis.createClient();

function cacheMiddleware(req, res, next) {
    const key = req.url;
    client.get(key, (err, data) => {
        if (err) throw err;
        if (data !== null) {
            res.send(data);
        } else {
            next();
        }
    });
}

app.get('/data', cacheMiddleware, (req, res) => {
    const data = getDataFromDatabase();
    client.setex(req.url, 3600, JSON.stringify(data));
    res.json(data);
});

説明

  • ミドルウェアは、データベース呼び出しを行う前に、キャッシュされたデータがないか Redis をチェックします。
  • データがキャッシュされていない場合は、データのフェッチに進み、キャッシュして、応答を送信します。

4. ステートレスなマイクロサービス

モノリシックな Node.js アプリケーションをステートレス マイクロサービスに分割することで、各サービスを個別にスケーリングできます。これにより、アプリケーションの一部 (ユーザー認証など) のスケーリングが他の部分 (支払い処理など) に影響を与えないようになります。

例: マイクロサービス アーキテクチャ

  • 各マイクロサービス (認証、製品カタログ、注文管理) は独立してデプロイされます。
  • API ゲートウェイまたはサービス メッシュは、正しいマイクロサービスへのリクエストのルーティングを処理します。

5. リバースプロキシの使用

リバース プロキシ サーバーは、負荷分散、SSL 終了、静的コンテンツの提供などのさまざまなタスクを処理でき、Node.js サーバーの負荷を軽減します。

例: NGINX を使用した静的コンテンツの提供

server {
    listen 80;

    location / {
        proxy_pass http://localhost:3000;
    }

    location /static/ {
        root /var/www/html;
    }
}

説明

  • NGINX は、動的リクエストを Node.js にプロキシし、静的ファイル (CSS、JS、画像) をサーバーから直接提供するために使用されます。

Node.js アプリケーションをスケーリングするためのツール

1.PM2

PM2 は、クラスタリング、自動再起動、負荷分散、プロセス監視をサポートする、Node.js アプリケーション向けの実稼働対応プロセス マネージャーです。

例: PM2 を使用してアプリケーションをスケーリングする

# Start the application with cluster mode and 4 instances
pm2 start app.js -i 4

説明

  • PM2 はアプリケーションの複数のインスタンスを管理し、自動負荷分散とプロセス監視を提供します。

2. Docker と Kubernetes

Dockerを使用してアプリケーションをコンテナ化し、Kubernetesにデプロイすると、Node.js アプリケーションを複数のサーバー間で簡単に拡張できます。 Kubernetes は、オーケストレーション、負荷分散、スケーリングを自動的に処理します。

例: Node.js アプリケーションの Docker 化

# Dockerfile
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]

Node.js アプリケーションをスケーリングするためのベスト プラクティス

  1. パフォーマンスの監視: New RelicDatadogPrometheus などのツールを使用して、パフォーマンス指標を追跡し、ボトルネックを特定します。
  2. 非同期プログラミングを使用する: Node.js は、I/O 操作などのタスクが非同期で処理される場合に最高のパフォーマンスを発揮します。イベントループをブロックしないようにしてください。
  3. データベース クエリの最適化: 接続プーリング、インデックス、キャッシュを使用して、データベースの負荷を軽減します。
  4. 垂直スケーリングよりも水平スケーリング: 水平スケーリング (サーバーの追加) は、垂直スケーリング (サーバー リソースの増加) よりも高い柔軟性とフォールト トレランスを提供します。
  5. サービスをステートレスに保つ: ステートレス サービスは、リクエスト間のメモリ状態に依存しないため、拡張が容易です。セッション管理には Redis やデータベースなどの外部システムを使用します。

結論

Node.js アプリケーションのスケーリングは、アプリケーションの成長に合わせてパフォーマンスを維持するために不可欠です。ロード バランシング、クラスタリング、キャッシュ、ステートレス マイクロサービスなどの手法と、PM2、Docker、Kubernetes などのツールを活用することで、Node.js アプリケーションを効率的に拡張できます。これらの戦略を実装すると、アプリケーションは速度や信頼性を犠牲にすることなく、トラフィックの増加や大規模なデータセットを処理できるようになります。

リリースステートメント この記事は次の場所に転載されています: https://dev.to/imsushant12/scaling-nodejs-applications-techniques-tools-and-best-practices-3344?1 侵害がある場合は、削除するために[email protected]に連絡してください。それ
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3