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")
})
}