前言
如果您使用 PM2 來管理 Node.js 進程,您可能已經注意到它支援叢集模式。這種模式允許 Node.js 創建多個進程。當您將叢集模式下的執行個體數量設定為 max 時,PM2 會自動建立與伺服器上可用 CPU 核心相對應的 Node 流程數。
PM2 透過利用 Node.js 的 Cluster 模組來實現這一點。該模組解決了 Node.js 的單線程特性,傳統上限制了其利用多個 CPU 核心的能力。但是 Cluster 模組內部是如何運作的呢?進程之間如何通訊?多個進程如何監聽同一個連接埠? Node.js 如何將請求分發到這些進程?如果您對這些問題感到好奇,請繼續閱讀。
核心原則
Node.js 工作進程是使用 child_process.fork() 方法建立的。這意味著有一個父進程和多個子進程。程式碼通常如下圖所示:
const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { for (let i = 0, n = os.cpus().length; i <p>如果您研究過作業系統,您可能熟悉 fork() 系統呼叫。呼叫進程是父進程,而新建立的進程是子進程。這些子進程與父進程共享相同的資料段和堆疊,但它們的物理記憶體空間不一定共享。在 Node.js 叢集中,<strong>master</strong> 進程偵聽連接埠並將傳入請求分發到 <strong>worker</strong> 進程。這涉及到解決三個核心主題:<strong>進程間通訊 (IPC)</strong>、<strong>負載平衡策略</strong>和<strong>多進程連接埠監聽</strong>。 </p> <h2> 進程間通訊(IPC) </h2> <p><strong>master</strong>程式使用process.fork()建立子程序。這些進程之間的通訊是透過 <strong>IPC 通道</strong> 處理的。作業系統提供了多種進程間通訊的機制,例如:</p> <ol> <li> <strong>共享記憶體</strong> 多個進程共享一個記憶體空間,通常透過信號量進行管理以實現同步和互斥。 </li> <li><p><strong>訊息傳遞</strong><br><br> 透過發送和接收訊息來處理交換資料。 </p></li> <li><p><strong>訊號量</strong><br><br> 信號量是系統分配的狀態值。缺乏控制的進程將被迫在特定的檢查點停止,等待繼續進行的信號。當僅限於二進位值(0 或 1)時,此機制稱為「互斥鎖」(互斥鎖)。 </p></li> <li><p><strong>管</strong><br><br> 管道連接兩個進程,允許一個進程的輸出作為另一個進程的輸入。這可以使用管道系統呼叫來創建。 | 的 | shell 腳本中的命令是這種機制的一個常見範例。 </p></li> </ol> <p>Node.js 使用基於事件的機制在父進程和子進程之間進行通訊。這是父進程向子程序發送 TCP 伺服器句柄的範例:<br> </p> <pre class="brush:php;toolbar:false">const cluster = require('cluster'); const os = require('os'); if (cluster.isMaster) { for (let i = 0, n = os.cpus().length; i <h2> 負載平衡策略 </h2> <p>如前所述,所有請求均由 <strong>master</strong> 進程分發。確保伺服器負載在工作進程之間均勻分佈需要負載平衡策略。 Node.js 預設使用 <strong>round-robin</strong> 演算法。 </p> <h3> 循環賽 </h3> <p>輪詢方法是 Nginx 也採用的常見負載平衡演算法。它的工作原理是按順序將傳入請求分發到每個進程,從第一個進程開始,到達最後一個進程後循環返回。然而,該方法假設所有進程的處理能力相同。在請求處理時間變化較大的場景下,可能會出現負載不平衡的情況。 </p> <p>為了解決這個問題,Nginx 經常使用<strong>加權循環(WRR)</strong>,其中伺服器被分配不同的權重。選擇權重最高的伺服器,直到其權重減少到零,此時根據新的權重序列重新開始循環。 </p> <p>您可以透過設定 NODE_CLUSTER_SCHED_POLICY 環境變數或透過 cluster.setupMaster(options) 配置來調整 Node.js 中的負載平衡策略。結合 Nginx 進行多機叢集和 Node.js Cluster 進行單機多進程平衡是常見的做法。 </p> <h2> 多進程連接埠監聽 </h2> <p>在 Node.js 的早期版本中,偵聽相同連接埠的多個進程會競爭傳入連接,從而導致負載分佈不均勻。後來透過循環賽策略解決了這個問題。目前方法的工作原理如下:</p> <ol> <li> <strong>master</strong> 進程建立一個套接字,將其綁定到一個位址,並開始監聽。 </li> <li>套接字的檔案描述符(fd)不會傳遞給工作進程。 </li> <li>當主進程接受新連線時,它會決定哪個工作進程應該處理該連線並相應地轉送它。 </li> </ol> <p>本質上,主進程監聽連接埠並使用定義的策略(例如,循環)將連線指派給工作進程。這種設計消除了worker之間的競爭,但要求master進程高度穩定。 </p><h2> 結論 </h2> <p>本文以 PM2 的 Cluster 模式為切入點,探討了 Node.js 的 Cluster 模組實作多進程應用程式背後的核心原理。我們將重點放在三個關鍵方面:進程間通訊、負載平衡和多進程連接埠監聽。 </p> <p>透過研究Cluster模組,我們可以看到很多基本原理和演算法是通用的。例如,循環演算法被用於作業系統進程調度和伺服器負載平衡。 master-worker架構類似Nginx中的多進程設計。同樣,信號量和管道等機制在各種編程範例中也無所不在。 </p> <p>雖然新技術不斷湧現,但它們的基礎始終如一。了解這些核心概念使我們能夠自信地推斷和適應新的挑戰。 </p> <hr> <h3> 我們是 Leapcell,是將 Node.js 專案部署到雲端的首選。 </h3> <p><img src="/static/imghwm/default1.png" data-src="https://img.php.cn/upload/article/000/000/000/173689747511076.jpg?x-oss-process=image/resize,p_40" class="lazy" alt="Understanding Node.js Cluster: The Core Concepts"></p> <p>Leapcell 是用於 Web 託管、非同步任務和 Redis 的下一代無伺服器平台:</p> <p><strong>多語言支援</strong></p>
- 使用 Node.js、Python、Go 或 Rust 進行開發。
免費部署無限個專案
- 只需支付使用費用-無請求,不收費。
無與倫比的成本效率
- 即用即付,無閒置費用。
- 範例:25 美元支援 694 萬個請求,平均回應時間為 60 毫秒。
簡化的開發者體驗
- 直覺的使用者介面,輕鬆設定。
- 完全自動化的 CI/CD 管道和 GitOps 整合。
- 即時指標和日誌記錄以獲取可行的見解。
輕鬆的可擴充性和高效能
- 自動擴展,輕鬆處理高並發。
- 零營運開銷-只需專注於建置。
在文件中探索更多資訊!
在 X 上追蹤我們:@LeapcellHQ
閱讀我們的部落格
以上是了解 Node.js 叢集:核心概念的詳細內容。更多資訊請關注PHP中文網其他相關文章!

JavaScript字符串替換方法詳解及常見問題解答 本文將探討兩種在JavaScript中替換字符串字符的方法:在JavaScript代碼內部替換和在網頁HTML內部替換。 在JavaScript代碼內部替換字符串 最直接的方法是使用replace()方法: str = str.replace("find","replace"); 該方法僅替換第一個匹配項。要替換所有匹配項,需使用正則表達式並添加全局標誌g: str = str.replace(/fi

因此,在這裡,您準備好了解所有稱為Ajax的東西。但是,到底是什麼? AJAX一詞是指用於創建動態,交互式Web內容的一系列寬鬆的技術。 Ajax一詞,最初由Jesse J創造

10款趣味橫生的jQuery遊戲插件,讓您的網站更具吸引力,提升用戶粘性!雖然Flash仍然是開發休閒網頁遊戲的最佳軟件,但jQuery也能創造出令人驚喜的效果,雖然無法與純動作Flash遊戲媲美,但在某些情況下,您也能在瀏覽器中獲得意想不到的樂趣。 jQuery井字棋遊戲 遊戲編程的“Hello world”,現在有了jQuery版本。 源碼 jQuery瘋狂填詞遊戲 這是一個填空遊戲,由於不知道單詞的上下文,可能會產生一些古怪的結果。 源碼 jQuery掃雷遊戲

本教程演示瞭如何使用jQuery創建迷人的視差背景效果。 我們將構建一個帶有分層圖像的標題橫幅,從而創造出令人驚嘆的視覺深度。 更新的插件可與JQuery 1.6.4及更高版本一起使用。 下載

Matter.js是一個用JavaScript編寫的2D剛體物理引擎。此庫可以幫助您輕鬆地在瀏覽器中模擬2D物理。它提供了許多功能,例如創建剛體並為其分配質量、面積或密度等物理屬性的能力。您還可以模擬不同類型的碰撞和力,例如重力摩擦力。 Matter.js支持所有主流瀏覽器。此外,它也適用於移動設備,因為它可以檢測觸摸並具有響應能力。所有這些功能都使其值得您投入時間學習如何使用該引擎,因為這樣您就可以輕鬆創建基於物理的2D遊戲或模擬。在本教程中,我將介紹此庫的基礎知識,包括其安裝和用法,並提供一

本文演示瞭如何使用jQuery和ajax自動每5秒自動刷新DIV的內容。 該示例從RSS提要中獲取並顯示了最新的博客文章以及最後的刷新時間戳。 加載圖像是選擇

本文討論了在瀏覽器中優化JavaScript性能的策略,重點是減少執行時間並最大程度地減少對頁面負載速度的影響。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

Dreamweaver Mac版
視覺化網頁開發工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

SublimeText3漢化版
中文版,非常好用

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。