預(yù)備知識(shí)
在如今機(jī)器的CPU都是多核的背景下,Node的單線程設(shè)計(jì)已經(jīng)沒(méi)法更充分的"壓榨"機(jī)器性能了。所以從v0.8開(kāi)始,Node新增了一個(gè)內(nèi)置模塊——“cluster”,故名思議,它可以通過(guò)一個(gè)父進(jìn)程管理一坨子進(jìn)程的方式來(lái)實(shí)現(xiàn)集群的功能。
學(xué)習(xí)cluster之前,需要了解process相關(guān)的知識(shí),如果不了解的話建議先閱讀process模塊、child_process模塊。
cluster借助child_process模塊的fork()方法來(lái)創(chuàng)建子進(jìn)程,通過(guò)fork方式創(chuàng)建的子進(jìn)程與父進(jìn)程之間建立了IPC通道,支持雙向通信。
cluster模塊最早出現(xiàn)在node.js v0.8版本中
為什么會(huì)存在cluster模塊?
Node.js是單線程的,那么如果希望利用服務(wù)器的多核的資源的話,就應(yīng)該多創(chuàng)建幾個(gè)進(jìn)程,由多個(gè)進(jìn)程共同提供服務(wù)。如果直接采用下列方式啟動(dòng)多個(gè)服務(wù)的話,會(huì)提示端口占用。
const http = require('http'); http.createServer((req, res) => { res.writeHead(200); res.end('hello world\n'); }).listen(8000); // 啟動(dòng)第一個(gè)服務(wù) node index.js & // 啟動(dòng)第二個(gè)服務(wù) node index.js & throw er; // Unhandled 'error' event ^ Error: listen EADDRINUSE :::8000 at Server.setupListenHandle [as _listen2] (net.js:1330:14) at listenInCluster (net.js:1378:12) at Server.listen (net.js:1465:7) at Object.(/Users/xiji/workspace/learn/node-basic/cluster/simple.js:5:4) at Module._compile (internal/modules/cjs/loader.js:702:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:713:10) at Module.load (internal/modules/cjs/loader.js:612:32) at tryModuleLoad (internal/modules/cjs/loader.js:551:12) at Function.Module._load (internal/modules/cjs/loader.js:543:3) at Function.Module.runMain (internal/modules/cjs/loader.js:744:10)