Node.js以其速度和效率而聞名,使其成為建立高效能、可擴展應用程式的流行選擇。
然而,Node.js 是開箱即用的,這意味著它在單一 CPU 核心上運行,這在多核心伺服器環境中可能會受到限制。如果您的應用程式是資源密集型的或您期望高流量,您將希望最大限度地利用伺服器的 CPU 核心。
這就是 Node.js 叢集的用武之地。
在這篇文章中,我們將深入探討Node.js 叢集是什麼、為什麼它很重要,以及如何使用它來提高應用程式的效能。
Node.js 叢集是一種允許您透過產生 Node.js 應用程式的多個實例(工作進程)來利用所有 CPU 核心的技術。
這些工作進程共享相同的連接埠並由主進程管理。每個工作人員都可以獨立處理傳入請求,從而允許您的應用程式並行分配工作負載和處理請求。
透過叢集 Node.js 應用程序,您可以:
在 Node.js 叢集中,有一個 master 流程,控制多個 worker 流程。
主進程不直接處理 HTTP 請求,而是管理處理 HTTP 請求的工作進程。來自客戶端的請求分佈在這些工作人員之間,有效地平衡負載。
如果工作進程因某種原因崩潰,主進程可以產生一個新進程,以確保最短的停機時間。
當您的應用程式滿足以下條件時,叢集特別有用:
在上述情況下,您可以使用非同步程式技術來提高吞吐量。
Node.js提供了內建的叢集模組來輕鬆建立叢集。讓我們透過一個簡單的範例來了解如何叢集 Node.js 應用程式。
第 1 步:設定您的應用程式
在新增叢集之前,我們假設您有一個簡單的 HTTP 伺服器(server.js):
const http = require('http'); const server = http.createServer((req, res) => { res.writeHead(200); res.end('Hello World\n'); }); server.listen(3000, () => { console.log(`Worker process ID: ${process.pid} is listening on port 3000`); });
該應用程式在單核心上運行。讓我們修改它以使用聚類。
第2步:使用叢集模組
叢集模組允許我們將當前進程分叉為多個工作進程。以下是如何實作聚類:
const cluster = require('cluster'); const http = require('http'); const os = require('os'); // Get the number of CPU cores const numCPUs = os.cpus().length; if (cluster.isMaster) { console.log(`Master process ID: ${process.pid}`); // Fork workers for each CPU core for (let i = 0; i { console.log(`Worker ${worker.process.pid} died. Spawning a new one...`); cluster.fork(); }); } else { // Workers share the same TCP connection http.createServer((req, res) => { res.writeHead(200); res.end('Hello from worker ' process.pid '\n'); }).listen(3000); console.log(`Worker process ID: ${process.pid}`); }
解釋:
1.主程序:當程序啟動時,它會檢查它是否是主程序(cluster.isMaster)。主站負責分叉工作進程,每個CPU核心一個。 os.cpus() 方法用於檢索可用的 CPU 核心數。
2.工作流程: 對於每個 CPU 核心,都會衍生一個新工作進程 (cluster.fork())。這些工作進程運行 HTTP 伺服器並處理傳入請求。
3. 容錯性: 如果一個工作進程崩潰了,cluster.on('exit') 事件被觸發,並且會產生一個新的工作進程來替換死掉的進程。
第 3 步:測試您的叢集應用程式
現在,如果您運行該應用程式:
node server.js
您會注意到創建了多個工作進程,每個進程都有一個唯一的進程 ID。 每個請求由不同的worker處理,有效平衡負載。
您可以透過發送多個請求並觀察工作負載如何在工作人員之間分配來測試叢集如何提高應用程式的效能。
所以,下次建立高效能 Node.js 應用程式時,請記得考慮叢集!
這就是本部落格的全部內容!請繼續關注更多更新並繼續建立令人驚嘆的應用程式! ? ✨
快樂編碼! ?
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3