2012-03-22 42 views
28

有人可以詳細解釋核心cluster模塊在Node.js中的工作原理嗎?集羣模塊如何在Node.js中工作?

工作人員如何能夠聽到一個單一的端口?

據我所知,主進程執行監聽,但是如何知道哪些端口要監聽,因爲在主進程之後啓動了工作進程?他們是否通過child_process.fork溝通渠道以某種方式與主人溝通?如果是這樣,到端口的傳入連接是如何從主機傳遞給工作人員的?

另外我想知道什麼邏輯是用來確定傳入連接傳遞給哪個工作者?

+0

我對集羣模塊如何路由TCP請求有疑問。例如,我有Redis pubsub代碼,npm集羣中的每個工作人員正在接收消息;即使HTTP請求只被路由到一個工作者。有沒有辦法配置集羣,以便只有一個工作者接收套接字請求,而不是所有的工人?我只是通過讓主人持有pubsub偵聽器,然後手動將其委派給每個工作人員來完成這項工作。但是,整個集羣的重點是爲您開箱即用...... – 2015-06-11 22:24:07

回答

12

我知道這是一個老問題,但現在這是在nodejs.org here:

解釋工作進程正在使用的child_process催生.fork方法, ,以便它們可以通過IPC與父級進行通信,並通過服務器 來回處理。

當您在worker中調用server.listen(...)時,它會序列化 參數並將請求傳遞給主進程。如果主人 進程已經具有與工作人員的 要求匹配的監聽服務器,則它將句柄傳遞給工作人員。如果它沒有 已經有一個符合該要求的監聽服務器,那麼它將創建一個,並將句柄傳遞給worker。

這導致在三個邊緣情況潛在地令人驚訝的行爲:

server.listen({FD:7}) - 由於消息被傳遞到主,在父 文件描述符7進行監聽的,並將句柄 傳遞給工作人員,而不是聽取工作人員的想法 7號文件描述符引用的內容。

server.listen(手柄) - 聽力上的把手明確將導致 工人使用附帶的手柄,而不是跟主 過程。如果工作人員已經擁有句柄,那麼推測你知道你在做什麼。

服務器。listen(0) - 通常,這將導致服務器偵聽 隨機端口。但是,在一個集羣中,每個工作人員每次收聽(0)時都會收到相同的「隨機」端口 。本質上,第一次隨機的港口是 ,但此後可以預見。如果您希望 在唯一端口上偵聽,請根據羣集 工作者ID生成端口號。

當多個進程都接受()相同的基礎資源時,操作系統在它們之間的負載平衡非常有效。 Node.js中或程序中沒有路由邏輯,工作人員之間沒有共享狀態。因此, 設計您的程序非常重要,因爲它不會過度依賴 內存中的數據對象來處理會話和登錄等內容。

因爲工人都是獨立的進程,他們可以被殺死或根據程序的需要重新生成,而不會影響其他 工人。只要有一些工作人員仍然活着,服務器 將繼續接受連接。但是,節點不會自動爲您管理工作人員的數量。管理員工池以滿足您應用程序的需求是您的責任。

8

NodeJS使用round-robin決定在子進程之間進行負載平衡。它將根據RR算法將傳入連接提供給一個空進程。

孩子和父母實際上並沒有共享任何東西,整個腳本從頭到尾都被執行,這是正常的C fork之間的主要區別。傳統C分叉的孩子會繼續從它離開的指令開始執行,而不是像NodeJS那樣的開始。所以如果你想分享任何東西,你需要連接到像MemCache或Redis這樣的緩存。

所以下面的代碼在控制檯上產生6 6 6(沒有惡意)。

var cluster = require("cluster"); 
var a = 5; 
a++; 
console.log(a); 
if (cluster.isMaster){ 
    worker = cluster.fork(); 
    worker = cluster.fork(); 
} 
+1

感謝您的循環信息,但我認爲您誤解了我關於連接傳遞的問題。我正在談論進入共享端口的tcp連接,而不是如何在工作人員之間進行通信。 – Epeli 2012-03-22 22:27:25

+0

@Epeli此討論可以幫助您解決以下問題:https://groups.google.com/forum/#!topic/nodejs/svIXu5wUXCI/discussion – Mustafa 2012-03-22 22:57:42

+2

我發現在Windows上它不遵守循環法。我可以派生10名工人,如果我的機器速度夠快,它會將所有傳入連接丟到第一個工人。有什麼建議麼? – 2012-06-13 19:59:52

4

這裏是一個blog post,說明這一點

+3

請注意,只有鏈接的答案是不鼓勵的,所以SO答案應該是搜索解決方案的終點(而另一個引用的中途停留時間往往會過時隨着時間的推移)。請考慮在此添加獨立的摘要,並將鏈接保留爲參考。 – kleopatra 2013-08-04 09:32:27

0

作爲@ OpenUserX03答案的更新,nodejs不再使用系統負載平衡,而是使用內置的負載平衡。從this post

修復Node v0.12使用循環法算法獲得新的實現,以更好的方式在工作人員之間分配負載。這是節點自此之後使用的默認方法,包括節點v6.0.0