nodejs集群


nodejs集群

單個 Node.js 實例運行在單個線程中。 為了充分利用多核系統,有時需要啟用一組 Node.js 進程去處理負載任務。

集群中的Master

現在讓我們詳細了解Master的職責。

  • Fork/Spawn Worker: Master負責創建你需要的Worker進程,但是你不能創建超過特定系統中可用的CPU內核數量的進程。
    換句話說,最大worker的數量應該等於CPU核心i的數量。如果它是雙核CPU,那么你應該fork最多2個工作進程。使用cluster.fork() API創建新的工作進程。
    當新的worker准備好時,集群將發出在線事件,這樣我們就可以使用集群了。在('online', ()=>{}) API上知道worker什么時候可以工作。

  • 重新fork/重新生成Worker:因為Worker進程可以在任何時間以任何原因被殺死。每當任何一個worker被殺死時,集群都會發出一個退出事件,因此我們應該使用API cluster.on('exit',())在一個舊worker死亡時重新生成新的worker。

  • 負載平衡:這是由node.js自動完成的,所以我們不需要編寫任何邏輯來實現。主進程Master負責以有效的方式將傳入的連接/請求分發給它的Worker進程。

實例:

const cluster = require('cluster');
const http = require('http');
const numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  console.log(`主進程 ${process.pid} 正在運行`);

  // 衍生工作進程。
  for (let i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', (worker, code, signal) => {
    console.log(`工作進程 ${worker.process.pid} 已退出`);
  });
} else {
  // 工作進程可以共享任何 TCP 連接。
  // 在本例子中,共享的是 HTTP 服務器。
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('你好世界\n');
  }).listen(8000);

  console.log(`工作進程 ${process.pid} 已啟動`);
}

在集群通信IPC

js集群模塊提供了一些IPC API,通過這些API主進程可以和工作進程對話,反之亦然。您可以使用名為process.send()的方法從一個進程向其他進程發送消息,並使用事件偵聽器API進程從一個進程接收消息到其他進程。(“消息”,()= > {})

if (cluster.isMaster) {
  clustor.on("message", (worker, msg) => {
    console.log(`message ${msg} recieved from worker`)
  })
  const worker = cluster.fork()
  worker.send("hello worker")
} else if (cluster.isWorker) {
  process.on("message", msg => {
    console.log(`message ${msg} recieved from master`)
    process.send("hello master")
  })
}

參考:
https://www.sysleaf.com/nodejs-cluster/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM