Node.js進程管理之進程集群詳解
一、cluster模塊
Node.js是單線程處理,對于高并發(fā)的請求怎么樣能增加吞吐量呢?為了提高服務器的利用率,能不能多核的來處理呢?于是就有了cluster模塊。
cluster模塊可以輕松實現(xiàn)運行在同一機器不同進程上的TCP或HTTP服務器集群。它們仍使用相同的底層套接字,從而在相同的IP地址和端口組合上處理請求。
下面是它的一些事件屬性和方法。
事件:
fork:當新的工作進程已經(jīng)被派生時發(fā)出。callback函數(shù)接收worker對象作為唯一的參數(shù)。function(Worker)
online:當新的進程發(fā)回一消息,表明它已經(jīng)啟動時發(fā)出。callback同上。
listening:當工作進程調用listen()開始監(jiān)聽端口時發(fā)出。callback:fucntion(Worker,address)
disconnect:當IPC通道被切斷時發(fā)出。如服務器調用worker.disconnect()的時候。callback:function(Worker)
exit:在Worker對象已斷開時發(fā)出。callback:function(Worker,code,signal)
setup:在setupMaster()被首次調用時發(fā)出。
屬性和方法:
settings:包含exec(工作進程的javascript文件)、args(傳遞的參數(shù)數(shù)組)、silent(斷開工作進程的IPC機制)屬性值,用于建立集群
isMaster:判斷當前進程是否是主進程
isWorker:判斷當前進程是否是工作進程
setupMaster([settings]):啟動主進程
disconnect([callback]):斷開工作進程的IPC機制,并關閉句柄,當斷開連接完成時回調
worker:引用在工作進程的當前Worker對象
workers:包含Worker對象,可以通過標識從主進程引用它們。cluster.workers[workerId]
二、Worker對象
當一個工作進程被派時,一個新的Worker對象同時在主進程和工作進程中創(chuàng)建。在工作進程中Worker對象用來表示當前的工作進程,并與正在發(fā)生的集群事件進行交互。在主進程中,Worker對象代表子工作進程,是主應用程序向他們發(fā)送信息,接收它們的狀態(tài)變化的事件甚至殺掉他們。
它也是有一些事件屬性方法。
事件:
message:在工作進程收到一個新信息時發(fā)出,回調函數(shù)把message作為唯一的參數(shù)值
disconnect:在IPC通道已對這個工作進程斷開后發(fā)出
exit:Worker對象已經(jīng)斷開時發(fā)出
error:工作進程發(fā)生錯誤時發(fā)出
屬性方法:
id:工作進程標識
Process:工作進程運行的ChildProcess對象
suicide:對這個工作進程調用kill()或disconnect()時被設置為true??梢允褂么藰酥緛泶_定是否要跳出嘗試的循環(huán),并退出
send(message,[sendHandle]):將消息發(fā)送到主進程
kill([signal]):通過斷開IPC通道殺掉當前工作進程,然后退出,將suicide設置為true。
disconnect():工作進程調它時,關閉所有服務器,等待關閉事件,并斷開IPC通道。當從主節(jié)點調時,發(fā)送一個內部消息給工作進程,使其斷開本身,設置suicide為true。
三、實踐
上面的也都是理論,下面通過實現(xiàn)一個HTTP集群來實踐一下。
1.主進程
var cluster = require('cluster');
var http = require('http');
if (cluster.isMaster) {
cluster.on('fork', function(worker) {
console.log("Worker " + worker.id + " created");
});
cluster.on('listening', function(worker, address) {
console.log("Worker " + worker.id +" is listening on " +
address.address + ":" + address.port);
});
cluster.on('exit', function(worker, code, signal) {
console.log("Worker " + worker.id +" Exited");
});
cluster.setupMaster({exec:'cluster_worker.js'});
var numCPUs = require('os').cpus().length;
for (var i = 0; i < numCPUs; i++) {
if (i>=4) break;
cluster.fork();
}
Object.keys(cluster.workers).forEach(function(id) {
cluster.workers[id].on('message', function(message){
console.log(message);
});
});
}2.工作進程
var cluster = require('cluster');
var http = require('http');
if (cluster.isWorker) {
http.Server(function(req, res) {
res.writeHead(200);
res.end("Process " + process.pid + " says hello");
process.send("Process " + process.pid + " handled request");
}).listen(8080, function(){
console.log("Child Server Running on Process: " + process.pid);
});
}3.HTTP客戶端測試
var http = require('http');
var options = { port: '8080'};
function sendRequest(){
http.request(options, function(response){
var serverData = '';
response.on('data', function (chunk) {
serverData += chunk;
});
response.on('end', function () {
console.log(serverData);
});
}).end();
}
for (var i=0; i<5; i++){
console.log("Sending Request");
sendRequest();
}首先是啟動主進程,創(chuàng)建工作進程開始監(jiān)聽
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe cluster_server.js Worker 1 created Worker 2 created Worker 3 created Worker 4 created Child Server Running on Process: 6152 Worker 1 is listening on null:8080 Child Server Running on Process: 10340 Worker 2 is listening on null:8080 Child Server Running on Process: 11412 Worker 3 is listening on null:8080 Child Server Running on Process: 12120 Worker 4 is listening on null:8080
其次啟動HTTP客戶端測試
"C:\Program Files (x86)\JetBrains\WebStorm 11.0.3\bin\runnerw.exe" F:\nodejs\node.exe cluster_client.js Sending Request Sending Request Sending Request Sending Request Sending Request Process 12120 says hello Process 11412 says hello Process 12120 says hello Process 10340 says hello Process 6152 says hello Process finished with exit code 0
到此這篇關于Node.js進程管理之進程集群的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
Node.js調用fs.renameSync報錯(Error: EXDEV, cross-device link not
這篇文章主要介紹了Node.js調用fs.renameSync報錯(Error: EXDEV, cross-device link not permitted),非常具有實用價值,需要的朋友可以參考下2017-12-12
Node.js服務器環(huán)境下使用Mock.js攔截AJAX請求的教程
Mock.js這個JavaScript庫最常見的用法便是被用來攔截AJAX請求,well,這里我們就來看一下Node.js服務器環(huán)境下使用Mock.js攔截AJAX請求的教程:2016-05-05
nodejs 使用nodejs-websocket模塊實現(xiàn)點對點實時通訊
這篇文章主要介紹了nodejs 使用nodejs-websocket模塊實現(xiàn)點對點實時通訊的實例代碼,代碼簡單易懂,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-11-11
Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程
相信對于很多關注javascript發(fā)展的同學來說,nodejs已經(jīng)不是一個陌生的詞眼,下面這篇文章主要給大家介紹了關于Windows系統(tǒng)下Node.js安裝以及環(huán)境配置的完美教程,需要的朋友可以參考下2022-06-06
使用cluster 將自己的Node服務器擴展為多線程服務器
nodejs在v0.6.x之后 增加了一個模塊 cluster 用于實現(xiàn)多進程,利用child_process模塊來創(chuàng)建和管理進程,增加程序在多核CPU機器上的性能表現(xiàn)。本文將介紹利用cluster模塊創(chuàng)建的多線程的問題。2014-11-11
NodeJS?Express使用ORM模型訪問關系型數(shù)據(jù)庫流程詳解
這篇文章主要介紹了NodeJS?Express使用ORM模型訪問關系型數(shù)據(jù)庫流程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-01-01

