溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Node.js進(jìn)程集群怎么實現(xiàn)

發(fā)布時間:2022-07-07 09:57:49 來源:億速云 閱讀:117 作者:iii 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Node.js進(jìn)程集群怎么實現(xiàn)的相關(guān)知識,內(nèi)容詳細(xì)易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇Node.js進(jìn)程集群怎么實現(xiàn)文章都會有所收獲,下面我們一起來看看吧。

一、cluster模塊

Node.js是單線程處理,對于高并發(fā)的請求怎么樣能增加吞吐量呢?為了提高服務(wù)器的利用率,能不能多核的來處理呢?于是就有了cluster模塊。

cluster模塊可以輕松實現(xiàn)運(yùn)行在同一機(jī)器不同進(jìn)程上的TCP或HTTP服務(wù)器集群。它們?nèi)允褂孟嗤牡讓犹捉幼?,從而在相同的IP地址和端口組合上處理請求。

下面是它的一些事件屬性和方法。

事件:

fork:當(dāng)新的工作進(jìn)程已經(jīng)被派生時發(fā)出。callback函數(shù)接收worker對象作為唯一的參數(shù)。function(Worker)

online:當(dāng)新的進(jìn)程發(fā)回一消息,表明它已經(jīng)啟動時發(fā)出。callback同上。

listening:當(dāng)工作進(jìn)程調(diào)用listen()開始監(jiān)聽端口時發(fā)出。callback:fucntion(Worker,address)

disconnect:當(dāng)IPC通道被切斷時發(fā)出。如服務(wù)器調(diào)用worker.disconnect()的時候。callback:function(Worker)

exit:在Worker對象已斷開時發(fā)出。callback:function(Worker,code,signal)

setup:在setupMaster()被首次調(diào)用時發(fā)出。

屬性和方法:

settings:包含exec(工作進(jìn)程的javascript文件)、args(傳遞的參數(shù)數(shù)組)、silent(斷開工作進(jìn)程的IPC機(jī)制)屬性值,用于建立集群

isMaster:判斷當(dāng)前進(jìn)程是否是主進(jìn)程

isWorker:判斷當(dāng)前進(jìn)程是否是工作進(jìn)程

setupMaster([settings]):啟動主進(jìn)程

disconnect([callback]):斷開工作進(jìn)程的IPC機(jī)制,并關(guān)閉句柄,當(dāng)斷開連接完成時回調(diào)

worker:引用在工作進(jìn)程的當(dāng)前Worker對象

workers:包含Worker對象,可以通過標(biāo)識從主進(jìn)程引用它們。cluster.workers[workerId]

二、Worker對象

當(dāng)一個工作進(jìn)程被派時,一個新的Worker對象同時在主進(jìn)程和工作進(jìn)程中創(chuàng)建。在工作進(jìn)程中Worker對象用來表示當(dāng)前的工作進(jìn)程,并與正在發(fā)生的集群事件進(jìn)行交互。在主進(jìn)程中,Worker對象代表子工作進(jìn)程,是主應(yīng)用程序向他們發(fā)送信息,接收它們的狀態(tài)變化的事件甚至殺掉他們。

它也是有一些事件屬性方法。

事件:

message:在工作進(jìn)程收到一個新信息時發(fā)出,回調(diào)函數(shù)把message作為唯一的參數(shù)值

disconnect:在IPC通道已對這個工作進(jìn)程斷開后發(fā)出

exit:Worker對象已經(jīng)斷開時發(fā)出

error:工作進(jìn)程發(fā)生錯誤時發(fā)出

屬性方法:

id:工作進(jìn)程標(biāo)識

Process:工作進(jìn)程運(yùn)行的ChildProcess對象

suicide:對這個工作進(jìn)程調(diào)用kill()或disconnect()時被設(shè)置為true??梢允褂么藰?biāo)志來確定是否要跳出嘗試的循環(huán),并退出

send(message,[sendHandle]):將消息發(fā)送到主進(jìn)程

kill([signal]):通過斷開IPC通道殺掉當(dāng)前工作進(jìn)程,然后退出,將suicide設(shè)置為true。

disconnect():工作進(jìn)程調(diào)它時,關(guān)閉所有服務(wù)器,等待關(guān)閉事件,并斷開IPC通道。當(dāng)從主節(jié)點調(diào)時,發(fā)送一個內(nèi)部消息給工作進(jìn)程,使其斷開本身,設(shè)置suicide為true。

三、實踐

上面的也都是理論,下面通過實現(xiàn)一個HTTP集群來實踐一下。

1.主進(jìn)程

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.工作進(jìn)程

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();
}

首先是啟動主進(jìn)程,創(chuàng)建工作進(jìn)程開始監(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

關(guān)于“Node.js進(jìn)程集群怎么實現(xiàn)”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對“Node.js進(jìn)程集群怎么實現(xiàn)”知識都有一定的了解,大家如果還想學(xué)習(xí)更多知識,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI