本文目錄一覽:
- 1、nodejs cluster 主進程有什麼用
- 2、Node.js真的有高並發優勢嗎
- 3、nodejs實現多進程(cluster 模式)
- 4、nodejs cluster.fork怎麼關閉進程
- 5、nodejs cluster 怎麼用
nodejs cluster 主進程有什麼用
我們都知道nodejs最大的特點就是單進程、無阻塞運行,並且是非同步事件驅動的。Nodejs的這些特性能夠很好的解決一些問題,例如在伺服器開發中,並發的請求處理是個大問題,阻塞式的函數會導致資源浪費和時間延遲。通過事件註冊、非同步函數,開發人員可以提高資源的利用率,性能也會改善。既然Node.js採用單進程、單線程模式,那麼在如今多核硬體流行的環境中,單核性能出色的Nodejs如何利用多核CPU呢?創始人Ryan Dahl建議,運行多個Nodejs進程,利用某些通信機制來協調各項任務。目前,已經有不少第三方的Node.js多進程支持模塊發布,而NodeJS 0.6.x 以上的版本提供了一個cluster模塊 ,允許創建「共享同一個socket」的一組進程,用來分擔負載壓力。本篇文章就基於該cluster模塊來講述Node.js在多核CPU下的編程。
Cluster模塊介紹
nodejs所提供的cluster模塊目前尚處於試驗階段,在v0.10.7的官方文檔上我們可以看到模塊的發布信息如下:
Stability: 1 – Experimental
關於該模塊的功能,源文檔描述如此「A single instance of Node runs in a single thread. To take advantage of multi-core systems the user will sometimes want to launch a cluster of Node processes to handle the load.」 其意就是:Node的示例以單進程的模式運行,有時為了充分利用多核系統的資源用戶需要運行一組Node進程來分擔負載。
Cluster用法介紹
首先貼出一段該模塊示例應用代碼,接下來進行詳細分析,代碼如下:
複製代碼
var cluster = require(‘cluster’);
var http = require(‘http’);
var numCPUs = require(‘os’).cpus().length;
if (cluster.isMaster) {
require(‘os’).cpus().forEach(function(){
cluster.fork();
});
cluster.on(‘exit’, function(worker, code, signal) {
console.log(‘worker ‘ + worker.process.pid + ‘ died’);
});
cluster.on(‘listening’, function(worker, address) {
console.log(“A worker with #”+worker.id+” is now connected to ” +
address.address +
“:” + address.port);
});
} else {
http.createServer(function(req, res) {
res.writeHead(200);
res.end(“hello world\n”);
console.log(‘Worker #’ + cluster.worker.id + ‘ make a response’);
}).listen(8000);
}
複製代碼
這段代碼很簡單,主線程就是當前運行的js文件,主線程根據你本機系統的核數來創建子進程。所有進程共享一個監聽埠8000,當有請求發起時,主線程會將該請求隨機分配給某個子進程。console.log(‘Worker #’ + cluster.worker.id + ‘ make a response’);這句代碼可以列印出是哪個進程處理該請求。
問題分析
我們前面提到有請求發起時,由系統來決定將該請求交給哪個進程進行處理。這種完全依賴於系統的負載均衡存在著一個重要缺陷:在windows,linux和Solaris上,只要某個子進程的accept queue為空(通常為最後創建的那個子進程),系統就會將多個connetion分配到同一個子進程上,這會造成進程間負載極為不均衡。特別是在使用長連接的時候,單位時間內的new coming connection並不高,子進程的accept queue往往均為空,就會導致connection會不停的分配給同一個進程。所以這種負載均衡完全依賴於accept queue的空閑程度,只有在使用短連接,而且並發非常高的情況下,才能達到負載均衡,但是這個時候系統的load會非常高,系統也會變得不穩定起來。
後記
後續筆者還將就nodejs下的多進程開發進行學習研究,並將總結進行分享。
Node.js真的有高並發優勢嗎
是的,適合I/O密集型應用,其特點為:
1. 它是一個Javascript運行環境
2. 依賴於Chrome V8引擎進行代碼解釋
3. 事件驅動
4. 非阻塞I/O
5. 輕量、可伸縮,適於實時數據交互應用
6. 單進程,單線程
最大優勢:可以處理數萬條連接,本身沒有太多的邏輯,只需要請求API,組織數據進行返回即可
缺點也是明顯的:
1. 不適合CPU密集型應用;
2. 只支持單核CPU,不能充分利用CPU
3. 可靠性低,一旦代碼某個環節崩潰,整個系統都崩潰
nodejs實現多進程(cluster 模式)
Nodejs的主進程是單線程的,但它有多線程處理方案(更準備來說是多進程方案),即主進程開啟不同的子進程,主進程接收所有請求,然後將分發給其它不同的nodejs子進程處理。
它一般有兩種實現:
Nodejs 的 cluster模式 用的就是第一種實現,它使用一個主線程 master 和多個子線程 worker ,形成一個集群,通過主線程來向子線程分發請求。cluster 實現了對 child_process 的封裝,通過 fork 方法創建子進程的方式實現了多進程模型。
http 和 cluster 、 process 都是 nodejs 的內置模塊,不需要額外安裝
實現過程大概是這樣的: cluster 模塊應用 child_process 來創建子進程,子進程通過複寫掉 cluster._getServer 方法,從而在 server.listen 來保證只有主進程監聽埠,主子進程通過 IPC 進行通信,其次主進程根據平台或者協議不同,應用兩種不同模塊( round_robin_handle.js 和 shared_handle.js )進行請求分發給子進程處理。
PM2是後台進程管理器,是多進程方案的一個成熟應用,可以幫助管理和保持應用程序在線。
全局安裝: npm install pm2@latest -g
它的使用也非常簡單:
PM2對nodejs應用,可以根據系統自動實現負載均衡: pm2 start http-server.js -i max
我們肯定不想每次啟動時,都要手動輸入一堆指令,所以我們可以將這些配置統一使用配置文件來管理,注意js文件名必須是 xxx.config.js ,我這裡用 ecosystem.config.js :
apps 數組中,可以放置多個對象,對應多個文件執行不同的配置
執行配置: pm2 start ecosystem.config.js –env dev
可以看到在啟動後,桌面上生成了流水和錯誤日誌:
nodejs cluster.fork怎麼關閉進程
cluster實質上是獨立的進程.進程是不能共享變數的.除非通過消息通訊.維護cluster共同的一個總連接數.但一個連接是不會被不同的cluster重用到的.
nodejs cluster 怎麼用
cluster實質上是獨立的進程.進程是不能共享變數的.除非通過消息通訊.維護cluster共同的一個總連接數.但一個連接是不會被不同的cluster重用到的.
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/159955.html