首頁 web前端 js教程 使用PM2將Node.js的叢集變得更容易的方法

使用PM2將Node.js的叢集變得更容易的方法

Dec 21, 2017 am 09:19 AM
javascript node.js

眾所周知,Node.js運行在Chrome的JavaScript執行平台上,我們把這個平台優雅地稱之為V8引擎。不論是V8引擎,還是之後的Node.js,都是以單執行緒的方式運作的,因此,在多核心處理器的系統中並不能發揮最大的效能。本文主要介紹了詳解如何使用PM2將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 參數用來告訴PM2以cluster_mode的形式運行你的app(對應的叫fork_mode),後面的數字表示要啟動的工作線程的數量。如果給定的數字為0,PM2則會根據你CPU核心的數量來產生對應的工作執行緒。

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

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

即時擴展集群

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

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

PM2的reload 功能將依序重新啟動所有的工作執行緒。每個執行緒會等待在新的執行緒建立之後才會被終止掉,因此,當你在產品環境部署新的程式碼時,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,這些產品的貢獻者一直在努力並使它們變得更好。

相關建議:

Redis叢集建立全記錄

關於叢集部署的10篇文章建議

簡單介紹mysql集群(圖)

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

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

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何使用WebSocket和JavaScript實現線上語音辨識系統 如何使用WebSocket和JavaScript實現線上語音辨識系統 Dec 17, 2023 pm 02:54 PM

如何使用WebSocket和JavaScript實現線上語音辨識系統引言:隨著科技的不斷發展,語音辨識技術已成為了人工智慧領域的重要組成部分。而基於WebSocket和JavaScript實現的線上語音辨識系統,具備了低延遲、即時性和跨平台的特點,成為了廣泛應用的解決方案。本文將介紹如何使用WebSocket和JavaScript來實現線上語音辨識系

WebSocket與JavaScript:實現即時監控系統的關鍵技術 WebSocket與JavaScript:實現即時監控系統的關鍵技術 Dec 17, 2023 pm 05:30 PM

WebSocket與JavaScript:實現即時監控系統的關鍵技術引言:隨著互聯網技術的快速發展,即時監控系統在各個領域中得到了廣泛的應用。而實現即時監控的關鍵技術之一就是WebSocket與JavaScript的結合使用。本文將介紹WebSocket與JavaScript在即時監控系統中的應用,並給出程式碼範例,詳細解釋其實作原理。一、WebSocket技

如何利用JavaScript和WebSocket實現即時線上點餐系統 如何利用JavaScript和WebSocket實現即時線上點餐系統 Dec 17, 2023 pm 12:09 PM

如何利用JavaScript和WebSocket實現即時線上點餐系統介紹:隨著網路的普及和技術的進步,越來越多的餐廳開始提供線上點餐服務。為了實現即時線上點餐系統,我們可以利用JavaScript和WebSocket技術。 WebSocket是一種基於TCP協定的全雙工通訊協議,可實現客戶端與伺服器的即時雙向通訊。在即時線上點餐系統中,當使用者選擇菜餚並下訂單

如何使用WebSocket和JavaScript實現線上預約系統 如何使用WebSocket和JavaScript實現線上預約系統 Dec 17, 2023 am 09:39 AM

如何使用WebSocket和JavaScript實現線上預約系統在當今數位化的時代,越來越多的業務和服務都需要提供線上預約功能。而實現一個高效、即時的線上預約系統是至關重要的。本文將介紹如何使用WebSocket和JavaScript來實作一個線上預約系統,並提供具體的程式碼範例。一、什麼是WebSocketWebSocket是一種在單一TCP連線上進行全雙工

JavaScript與WebSocket:打造高效率的即時天氣預報系統 JavaScript與WebSocket:打造高效率的即時天氣預報系統 Dec 17, 2023 pm 05:13 PM

JavaScript和WebSocket:打造高效的即時天氣預報系統引言:如今,天氣預報的準確性對於日常生活以及決策制定具有重要意義。隨著技術的發展,我們可以透過即時獲取天氣數據來提供更準確可靠的天氣預報。在本文中,我們將學習如何使用JavaScript和WebSocket技術,來建立一個高效的即時天氣預報系統。本文將透過具體的程式碼範例來展示實現的過程。 We

簡易JavaScript教學:取得HTTP狀態碼的方法 簡易JavaScript教學:取得HTTP狀態碼的方法 Jan 05, 2024 pm 06:08 PM

JavaScript教學:如何取得HTTP狀態碼,需要具體程式碼範例前言:在Web開發中,經常會涉及到與伺服器進行資料互動的場景。在與伺服器進行通訊時,我們經常需要取得傳回的HTTP狀態碼來判斷操作是否成功,並根據不同的狀態碼來進行對應的處理。本篇文章將教你如何使用JavaScript來取得HTTP狀態碼,並提供一些實用的程式碼範例。使用XMLHttpRequest

javascript如何使用insertBefore javascript如何使用insertBefore Nov 24, 2023 am 11:56 AM

用法:在JavaScript中,insertBefore()方法用於在DOM樹中插入一個新的節點。這個方法需要兩個參數:要插入的新節點和參考節點(即新節點將要插入的位置的節點)。

JavaScript與WebSocket:打造高效率的即時影像處理系統 JavaScript與WebSocket:打造高效率的即時影像處理系統 Dec 17, 2023 am 08:41 AM

JavaScript是一種廣泛應用於Web開發的程式語言,而WebSocket則是一種用於即時通訊的網路協定。結合二者的強大功能,我們可以打造一個高效率的即時影像處理系統。本文將介紹如何利用JavaScript和WebSocket來實作這個系統,並提供具體的程式碼範例。首先,我們需要明確指出即時影像處理系統的需求和目標。假設我們有一個攝影機設備,可以擷取即時的影像數

See all articles