首頁  >  文章  >  web前端  >  PM2將Node.js的叢集變得更加容易的實作方法

PM2將Node.js的叢集變得更加容易的實作方法

小云云
小云云原創
2018-01-18 16:48:411301瀏覽

本文主要介紹了詳解如何使用PM2將Node.js的叢集變得更加容易,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟著小編過來看看吧,希望能幫助大家。

介紹

眾所周知,Node.js運行在Chrome的JavaScript執行時間平台上,我們把平台優雅地稱之為V8引擎。不論是V8引擎,還是之後的Node.js,都是以單執行緒的方式運作的,因此,在多核心處理器的系統中並不能發揮最大的效能。

Node.js的cluster模組

幸運的是,Node.js給了我們cluster模組,它可以產生多個工作執行緒來共享同一個TCP連接。

它是如何運作的呢?

首先,Cluster會建立一個master,然後根據你指定的數量複製出多個server app(也稱為工作執行緒)。它透過IPC通道與工作線程之間進行通信,並使用內建的負載平衡來更好地處理線程之間的壓力,該負載平衡使用了Round-robin演算法(也被稱之為循環演算法)。

當使用Round-robin調度策略時,master accepts()所有傳入的連線請求,然後將對應的TCP請求處理傳送給選取的工作執行緒(該方式仍透過IPC來進行通訊)。

那要如何來使用呢?

下面是一個最基本的例子:


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&#39;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);
}

當然,你可以指定任意數量的工作線程,線程的數量不僅限於CPU核心的數量,因為它只是作為一個運行在CPU上的子執行緒。

正如你所看到的,要使其正常運行,你需要將你的程式碼封裝到cluster的處理邏輯中,並添加一些額外的程式碼來指定當一個執行緒掛掉之後如何進行處理。

使用PM2的方式

內建的cluster

#PM2內部包含了上述所有的處理邏輯,因此你不必對程式碼做任何修改。我們將上面的程式碼還原成最原始的形式:


var http = require(&#39;http&#39;);

http.createServer(function(req, res) { 
 res.writeHead(200);
 res.end("hello world");
}).listen(8080);

然後在控制台執行:


$ pm2 start app.js -i 4

-i 7a19f9eedaa6c9b3a68840244fe15ad6參數用來告訴PM2以cluster_mode的形式運行你的app(對應的叫fork_mode),後面的數字表示要啟動的工作線程的數量。如果給定的數字為0,PM2則會根據你CPU核心的數量來產生對應的工作執行緒。

不論什麼情況下,保持你的apps一直運行

如果任意一個工作線程掛掉了,不用擔心,PM2會立即將其重啟。當然,你也完全可以在任何時候手動重啟這些線程:

即時擴展集群

任何時候,如果你需要增加工作線程的數量,可以透過pm2 scale f364e1ec0e8960b6c941898fe1d43f4f 751fecf49c9d13ca89ee2cbb9b75d4f6來擴充叢集。參數751fecf49c9d13ca89ee2cbb9b75d4f6指定工作執行緒的數量,被用來增加或減少群集數。你也可以透過pm2 scale app +3的方式來指定要增加多少工作執行緒。

在產品環境實作零停機更新

PM2的reload f364e1ec0e8960b6c941898fe1d43f4f功能將依序重新啟動所有的工作執行緒。每個執行緒會等待在新的執行緒建立之後才會被終止掉,因此,當你在產品環境部署新的程式碼時,server會不間斷地一直保持運作。

使用gracefulReload功能可以達到相同的目的,不同的是它不會立即終止工作線程,而是透過IPC發送一個shutdown訊號來關閉所有當前的連接並處理一些自訂的任務,然後再優雅地退出。如下面的程式碼:


process.on(&#39;message&#39;, function(msg) { 
 if (msg === &#39;shutdown&#39;) {
  close_all_connections();
  delete_cache();
  server.close();
  process.exit(0);
 }
});

將PM2配置成自動啟動

想要PM2在伺服器重新啟動後自動執行之前的應用,可以先透過pm2 start啟動你的應用,然後執行下面的命令:


pm2 save

這將在~/.pm2目錄下產生一個dump.pm2文件,裡面描述了當前PM2上運行著的所有應用。然後執行指令:


pm2 startup [platform]

注意有必要加入可選參數platform以明確告知pm2目前的系統環境。這樣,下次當伺服器重新啟動時,PM2會自動運行先前儲存的應用程式。

結論

Cluster模組的功能非常強大,使用PM2會使它變得更容易。在Node 0.10.x時代cluster.js還只是個試驗品,但從Node 0.11.x開始已經逐漸成熟並開始準備正式發布,當然也包括Node 0.12.x版本。強烈建議使用最新版的Node.js和PM2,這些產品的貢獻者一直在努力並使它們變得更好。

相關推薦:

#

關於Redis叢集故障的分析

Redis叢集建立圖文教學

redis叢集建置教學課程及遇到的問題處理

以上是PM2將Node.js的叢集變得更加容易的實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn