介紹
創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供禮縣網(wǎng)站建設(shè)、禮縣做網(wǎng)站、禮縣網(wǎng)站設(shè)計(jì)、禮縣網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計(jì)與制作、禮縣企業(yè)網(wǎng)站模板建站服務(wù),十余年禮縣做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。
眾所周知,Node.js運(yùn)行在Chrome的JavaScript運(yùn)行時(shí)平臺(tái)上,我們把該平臺(tái)優(yōu)雅地稱之為V8引擎。不論是V8引擎,還是之后的Node.js,都是以單線程的方式運(yùn)行的,因此,在多核心處理器的系統(tǒng)中并不能發(fā)揮其最大的性能。
Node.js的cluster模塊
幸運(yùn)的是,Node.js給我們提供了cluster模塊,它可以生成多個(gè)工作線程來共享同一個(gè)TCP連接。
它是如何運(yùn)作的呢?
首先,Cluster會(huì)創(chuàng)建一個(gè)master,然后根據(jù)你指定的數(shù)量復(fù)制出多個(gè)server app(也被稱之為工作線程)。它通過IPC通道與工作線程之間進(jìn)行通信,并使用內(nèi)置的負(fù)載均衡來更好地處理線程之間的壓力,該負(fù)載均衡使用了Round-robin算法(也被稱之為循環(huán)算法)。
當(dāng)使用Round-robin調(diào)度策略時(shí),master accepts()所有傳入的連接請(qǐng)求,然后將相應(yīng)的TCP請(qǐng)求處理發(fā)送給選中的工作線程(該方式仍然通過IPC來進(jìn)行通信)。
那如何來使用呢?
下面是一個(gè)最基本的例子:
var cluster = require('cluster'); var http = require('http'); var os = require('os'); var numCPUs = os.cpus().length; if (cluster.isMaster) { // Master: // Let's fork as many workers as you have CPU cores for (var i = 0; i < numCPUs; ++i) { cluster.fork(); } } else { // Worker: // Let's spawn a HTTP server // (Workers can share any TCP connection. // In this case its a HTTP server) http.createServer(function(req, res) { res.writeHead(200); res.end("hello world"); }).listen(8080); }
當(dāng)然,你可以指定任意數(shù)量的工作線程,線程的數(shù)量不僅限于CPU核心的數(shù)量,因?yàn)樗皇亲鳛橐粋€(gè)運(yùn)行在CPU上的子線程。
正如你所看到的,要使其正常運(yùn)行,你需要將你的代碼封裝到cluster的處理邏輯中,并添加一些額外的代碼來指定當(dāng)一個(gè)線程掛掉之后如何進(jìn)行處理。
使用PM2的方式
內(nèi)置的cluster
PM2內(nèi)部包含了所有上述的處理邏輯,因此你不必對(duì)代碼做任何修改。我們將上面的代碼還原成最原始的形式:
var http = require('http'); http.createServer(function(req, res) { res.writeHead(200); res.end("hello world"); }).listen(8080);
然后在控制臺(tái)執(zhí)行:
$ pm2 start app.js -i 4
-i
不論什么情況下,保持你的apps一直運(yùn)行
如果任意一個(gè)工作線程掛掉了,不用擔(dān)心,PM2會(huì)立即將其重啟。當(dāng)然,你也完全可以在任何時(shí)候手動(dòng)重啟這些線程:
實(shí)時(shí)擴(kuò)展集群
任何時(shí)候,如果你需要增加工作線程的數(shù)量,可以通過pm2 scale
在產(chǎn)品環(huán)境實(shí)現(xiàn)零停機(jī)更新
PM2的reload
使用gracefulReload功能可以達(dá)到相同的目的,不同的是它不會(huì)立即終止工作線程,而是通過IPC發(fā)送一個(gè)shutdown信號(hào)來關(guān)閉所有當(dāng)前的連接并處理一些自定義的任務(wù),然后再優(yōu)雅地退出。如下面的代碼:
process.on('message', function(msg) { if (msg === 'shutdown') { close_all_connections(); delete_cache(); server.close(); process.exit(0); } });
將PM2配置成自動(dòng)啟動(dòng)
想要PM2在服務(wù)器重啟后自動(dòng)運(yùn)行之前的應(yīng)用,可以先通過pm2 start啟動(dòng)你的應(yīng)用,然后執(zhí)行下面的命令:
pm2 save
這將在~/.pm2目錄下生成一個(gè)dump.pm2文件,里面描述了當(dāng)前PM2上運(yùn)行著的所有應(yīng)用。然后執(zhí)行命令:
pm2 startup [platform]
注意有必要添加可選參數(shù)platform以明確告知pm2當(dāng)前的系統(tǒng)環(huán)境。這樣,下次當(dāng)服務(wù)器重啟時(shí),PM2會(huì)自動(dòng)運(yùn)行之前保存的應(yīng)用。
結(jié)論
Cluster模塊的功能非常強(qiáng)大,使用PM2會(huì)使它變得更加容易。在Node 0.10.x時(shí)代cluster.js還只是個(gè)試驗(yàn)品,但從Node 0.11.x開始已經(jīng)逐漸成熟并開始準(zhǔn)備正式發(fā)布,當(dāng)然也包括Node 0.12.x版本。強(qiáng)烈推薦使用最新版的Node.js和PM2,這些產(chǎn)品的貢獻(xiàn)者們一直在努力并使它們變得更好。
盡情享受PM2帶給Node.js集群操作的便利吧!
原文地址:https://keymetrics.io/2015/03/26/pm2-clustering-made-easy/
更多有關(guān)PM2的安裝和使用可以查看這里的文檔:http://pm2.keymetrics.io/docs/usage/quick-start/
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。