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 < numCPUs; i++) { cluster.fork(); } // Listen for worker exit and replace it with a new one cluster.on('exit', (worker, code, signal) => { 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)。 master 負責分叉工作進程,每個 CPU 核心一個。 os.cpus() 方法用於檢索可用的 CPU 核心數。
2。工作流程: 對於每個 CPU 核心,都會分叉新工作進程 (cluster.fork())。這些工作進程運行 HTTP 伺服器並處理傳入請求。
3。容錯性:如果工作進程崩潰,則會觸發 cluster.on('exit') 事件,並產生一個新的工作進程來取代失效的進程。
第 3 步:測試您的叢集應用程式
現在,如果您運行該應用程式:
node server.js
您會注意到創建了多個工作進程,每個進程都有一個唯一的進程 ID。 每個請求由不同的worker處理,有效平衡負載。
您可以透過發送多個請求並觀察工作負載如何在工作人員之間分配來測試叢集如何提高應用程式的效能。
所以,下次建立高效能 Node.js 應用程式時,請記得考慮叢集!
這就是本部落格的全部內容了!請繼續關注更多更新並繼續建立令人驚嘆的應用程式! ?✨
快樂編碼! ?
以上是叢集您的 Node.js 應用程式以獲得更好的效能的詳細內容。更多資訊請關注PHP中文網其他相關文章!