node.js cluster模式啟用方式


  眾所周知,Node.js運行在Chrome的JavaScript運行時平台上,我們把該平台優雅地稱之為V8引擎。不論是V8引擎,還是之后的Node.js,都是以單線程的方式運行的,因此,在多核心處理器的系統中並不能發揮其最大的性能。本文主要介紹了詳解如何使用PM2將Node.js的集群變得更加容易,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧,希望能幫助到大家。

 

1.  Node.js的cluster模塊

  幸運的是,Node.js給我們提供了cluster模塊,它可以生成多個工作線程來共享同一個TCP連接。

  它是如何運作的呢?

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

  法)。

  當使用Round-robin調度策略時,master accepts()所有傳入的連接請求,然后將相應的TCP請求處理發送給選中的工作線程(該方式仍然通過IPC來進行通信)。

  那如何來使用呢?

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

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);

}

  

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

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

 

2.  使用PM2的方式

  內置的cluster

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

1

2

3

4

5

6

var http = require('http');

 

http.createServer(function(req, res) {

 res.writeHead(200);

 res.end("hello world");

}).listen(8080);

  然后在控制台執行:$ pm2 start app.js -i 4

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

  

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

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

 

  實時擴展集群

  任何時候,如果你需要增加工作線程的數量,可以通過pm2 scale <app name> <n>來對集群進行擴展。參數<n>指定工作線程的數量,被用來增加或減少集群數。你也可以通過pm2 scale app +3的方式來指定要增加多少工作線程。

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

  PM2的reload <app name>功能將依次重啟所有的工作線程。每一個線程會等待在新的線程創建之后才會被終止掉,因此,當你在產品環境部署新的代碼時,server會不間斷地一直保持運行。

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

1

2

3

4

5

6

7

8

process.on('message', function(msg) {

 if (msg === 'shutdown') {

  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會自動運行之前保存的應用。

3.  通過配置pm2文件啟動cluster模式(簡單快捷)

  pm2啟動文件:

  {

    "apps": [

      {
         "name": "mywork", //應用程序名稱

         "cwd""srv/node-app/current",//應用程序所在的目錄

        "script": "bin/www",//應用程序的腳本路徑
     "exec_mode": "cluster",//應用程序啟動模式,這里設置的是cluster_mode(集群),默認是fork
  
        

      }
     ]
  }
更詳細的pm2啟動文件配置:http://www.cnblogs.com/lxg0/p/7771229.html#commentform

 

結論

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

  力並使它們變得更好。

相關推薦:

Redis集群搭建全記錄

有關集群部署的10篇文章推薦

簡單介紹mysql集群(圖)

以上就是使用PM2將Node.js的集群變得更加容易的方法的詳細內容,更多請關注php中文網其它相關文章!

 

本文原創發布php中文網 ,轉載請注明出處,感謝您的尊重!

原文網址:http://www.php.cn/js-tutorial-382831.html


免責聲明!

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



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