中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

詳解如何使用PM2將Node.js的集群變得更加容易

發布時間:2020-10-08 14:03:42 來源:腳本之家 閱讀:401 作者:Jaxu 欄目:web開發

介紹

眾所周知,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'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('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核心的數量來生成對應的工作線程。

詳解如何使用PM2將Node.js的集群變得更加容易

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

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

詳解如何使用PM2將Node.js的集群變得更加容易

實時擴展集群

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

詳解如何使用PM2將Node.js的集群變得更加容易

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

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

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

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

結論

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

盡情享受PM2帶給Node.js集群操作的便利吧!

原文地址:https://keymetrics.io/2015/03/26/pm2-clustering-made-easy/

更多有關PM2的安裝和使用可以查看這里的文檔:http://pm2.keymetrics.io/docs/usage/quick-start/

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海城市| 曲靖市| 遂溪县| 犍为县| 五指山市| 仲巴县| 京山县| 成安县| 呈贡县| 宝清县| 阳西县| 孝义市| 衡南县| 拉萨市| 阜康市| 襄樊市| 纳雍县| 玛曲县| 伊宁县| 长海县| 乌兰浩特市| 仪陇县| 德兴市| 驻马店市| 广水市| 蒙城县| 当涂县| 多伦县| 阳城县| 斗六市| 聂荣县| 邹城市| 原平市| 永仁县| 三门县| 西宁市| 兴宁市| 巩留县| 德惠市| 揭西县| 罗甸县|