Node.js アプリケーションが成長するにつれて、より優れたパフォーマンスとスケーラビリティに対する要求が高まります。 Node.js は大規模なデータ集約型アプリケーションを処理するように設計されていますが、負荷がかかった状態でパフォーマンスと可用性を維持するには、適切にスケーリングする方法を理解することが重要です。この記事では、Node.js アプリケーションを効果的に拡張するための主要なテクニックとツールについて説明します。
スケーリングとは、ユーザー ベースの増加、データの増加、トラフィックの増加などによる負荷の増加を処理するアプリケーションの能力を指します。スケーリングを行わないと、アプリケーションはパフォーマンスの低下、ダウンタイム、リソースの非効率に直面する可能性があります。
垂直スケーリング: 単一サーバーにさらに多くの電力 (CPU、RAM) を追加します。これによりサーバーの容量は増加しますが、物理的な制限があります。
水平スケーリング: サーバーを追加して負荷を分散すること。一般に「スケールアウト」と呼ばれます。この方法はより柔軟であり、大規模なシステムでよく使用されます。
負荷分散は、受信トラフィックを複数のサーバーに分散して、単一のサーバーが過負荷にならないようにする方法です。これは、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 はシングルスレッドですが、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); }
説明:
キャッシュは、頻繁に要求されるデータをデータベースから再フェッチしたり結果を再計算したりするのではなく、メモリに保存することで応答時間を短縮し、負荷を軽減します。
例: キャッシュに 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); });
説明:
モノリシックな Node.js アプリケーションをステートレス マイクロサービスに分割することで、各サービスを個別にスケーリングできます。これにより、アプリケーションの一部 (ユーザー認証など) のスケーリングが他の部分 (支払い処理など) に影響を与えないようになります。
例: マイクロサービス アーキテクチャ
リバース プロキシ サーバーは、負荷分散、SSL 終了、静的コンテンツの提供などのさまざまなタスクを処理でき、Node.js サーバーの負荷を軽減します。
例: NGINX を使用した静的コンテンツの提供
server { listen 80; location / { proxy_pass http://localhost:3000; } location /static/ { root /var/www/html; } }
説明:
PM2 は、クラスタリング、自動再起動、負荷分散、プロセス監視をサポートする、Node.js アプリケーション向けの実稼働対応プロセス マネージャーです。
例: PM2 を使用してアプリケーションをスケーリングする
# Start the application with cluster mode and 4 instances pm2 start app.js -i 4
説明:
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 アプリケーションのスケーリングは、アプリケーションの成長に合わせてパフォーマンスを維持するために不可欠です。ロード バランシング、クラスタリング、キャッシュ、ステートレス マイクロサービスなどの手法と、PM2、Docker、Kubernetes などのツールを活用することで、Node.js アプリケーションを効率的に拡張できます。これらの戦略を実装すると、アプリケーションは速度や信頼性を犠牲にすることなく、トラフィックの増加や大規模なデータセットを処理できるようになります。
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3