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

来源:http://www.cnblogs.com/angelasp/archive/2016/12/28/6231028.html
-Advertisement-
Play Games

介紹 眾所周知,Node.js運行在Chrome的JavaScript運行時平臺上,我們把該平臺優雅地稱之為V8引擎。不論是V8引擎,還是之後的Node.js,都是以單線程的方式運行的,因此,在多核心處理器的系統中並不能發揮其最大的性能。 Node.js的cluster模塊 幸運的是,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'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核心的數量來生成對應的工作線程。

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

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

實時擴展集群

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

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

  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/


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在前一篇文中,我們對一個聚合SDK服務端所需要實現的功能作了簡單的分析。通過兩個主要場景的功能流程圖,我們可以看到,作為多款游戲要適配多個渠道的統一請求轉發中心,TYPESDK服務端主要需要實現的功能有以下幾個要點: l 接收請求和返迴響應,通常是HTTP的請求響應。 l 獲取配置信息。 n 識別游 ...
  • ECMAScript 6 是 JavaScript 語言的最新一代標準,當前標準已於 2015 年 6 月正式發佈,故又稱 ECMAScript 2015。 ES6對數據類型進行了一些擴展 在js中使用ES6必須先聲明 嚴格模式 "use strict" let變數 let特性: 1、不允許重覆聲明 ...
  • 項目上,經常需要對數組操作。所以,本文重點講解Array類型的一些常見的操作方法。 ...
  • “什麼是引用類型?”。如果你學過Java或者PHP編程的話,那麼我可以通俗的打個比方的講下,js中的引用類型就好比PHP或者Java中的Class類;那麼引用類型的值(即對象)好比PHP/Java中的Class類實例化後的對象。 ...
  • 音視頻的發展史 早期:<embed>+<object>+文件 問題:不是所有瀏覽器都支持,而且embed不是標準。 現狀:Realplay、window media、Quick Time 、Flash 問題:每個廠商每個標準,網站編碼和格式也都不相同,flash的出現解決了面的問題,但是apple在 ...
  • Form表單驗證: js基礎考試內容,form表單驗證,正則表達式,blur事件,自動獲取數組,以及css佈局樣式,動態清除等。完整代碼如下: 效果 如下圖所示: 【結語】 三人行,必有我師焉。 ——請多多支持,多多評論。 ...
  • 下個月就要過年了,感覺有點瞎忙。翻了翻博客,感覺這個月都在打醬油啊。藉口那麼多,其實真的有點懶了,呵呵! 我爭取在放假前,將自我總結以及來年計劃發出來,把自己打造為勉族,不然真要渾噩度日了。 前幾天,項目有個功能和某寶購物支付密碼的輸入框有點類似,就自己寫了這篇博文,權當總結筆記吧。 啰嗦半天了,直 ...
  • ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...