」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 叢集您的 Node.js 應用程式以獲得更好的效能

叢集您的 Node.js 應用程式以獲得更好的效能

發佈於2024-11-08
瀏覽:684

Node.js以其速度效率而聞名,使其成為建立高效能、可擴展應用程式的流行選擇。
然而,Node.js 是開箱即用的,這意味著它在單一 CPU 核心上運行,這在多核心伺服器環境中可能會受到限制。如果您的應用程式是資源密集型的或您期望高流量,您將希望最大限度地利用伺服器的 CPU 核心。
這就是 Node.js 叢集的用武之地。

在這篇文章中,我們將深入探討Node.js 叢集是什麼、為什麼它很重要,以及如何使用它來提高應用程式的效能

什麼是 Node.js 叢集?

Node.js 叢集是一種允許您透過產生 Node.js 應用程式的多個實例(工作進程)來利用所有 CPU 核心的技術。
這些工作進程共享相同的連接埠並由主進程管理。每個工作人員都可以獨立處理傳入請求,從而允許您的應用程式並行分配工作負載和處理請求。

透過叢集 Node.js 應用程序,您可以:

  • 利用多個CPU核心
  • 提高應用程式效能
  • 在一名工作人員崩潰的情況下提供容錯能力
  • 水平擴展而不會使程式碼庫過於複雜

集群如何運作?

在 Node.js 叢集中,有一個 master 流程,控制多個 worker 流程。
主進程不直接處理 HTTP 請求,而是管理處理 HTTP 請求的工作進程。來自客戶端的請求分佈在這些工作人員之間,有效地平衡負載。

如果工作進程因某種原因崩潰,主進程可以產生一個新進程,以確保最短的停機時間。

什麼時候該使用集群?

當您的應用程式滿足以下條件時,叢集特別有用:

  • 流量高,需要處理大量並發請求
  • 執行 CPU 密集型任務,例如視訊編碼、影像處理或大規模資料解析。
  • 在未充分利用的多核心處理器上運行 如果您的應用程式花費大量時間等待 I/O 操作,例如資料庫查詢或 API 呼叫,叢集可能不會顯著提高效能。

在上述情況下,您可以使用非同步程式技術來提高吞吐量

如何在 Node.js 中實作叢集

Node.js提供了內建的叢集模組來輕鬆建立叢集。讓我們透過一個簡單的範例來了解如何叢集 Node.js 應用程式。

第 1 步:設定您的應用程式
在新增叢集之前,我們假設您有一個簡單的 HTTP 伺服器(server.js):

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200);
  res.end('Hello World\n');
});

server.listen(3000, () => {
  console.log(`Worker process ID: ${process.pid} is listening on port 3000`);
});

該應用程式在單核心上運行。讓我們修改它以使用聚類。

第2步:使用叢集模組
叢集模組允許我們將當前進程分叉為多個工作進程。以下是如何實作聚類:

const cluster = require('cluster');
const http = require('http');
const os = require('os');

// Get the number of CPU cores
const numCPUs = os.cpus().length;

if (cluster.isMaster) {
  console.log(`Master process ID: ${process.pid}`);

  // Fork workers for each CPU core
  for (let i = 0; i  {
    console.log(`Worker ${worker.process.pid} died. Spawning a new one...`);
    cluster.fork();
  });
} else {
  // Workers share the same TCP connection
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello from worker '   process.pid   '\n');
  }).listen(3000);

  console.log(`Worker process ID: ${process.pid}`);
}

解釋:
1.主程序:當程序啟動時,它會檢查它是否是主程序(cluster.isMaster)。主站負責分叉工作進程,每個CPU核心一個。 os.cpus() 方法用於檢索可用的 CPU 核心數。

2.工作流程: 對於每個 CPU 核心,都會衍生一個新工作進程 (cluster.fork())。這些工作進程運行 HTTP 伺服器並處理傳入請求。

3. 容錯性: 如果一個工作進程崩潰了,cluster.on('exit') 事件被觸發,並且會產生一個新的工作進程來替換死掉的進程。

第 3 步:測試您的叢集應用程式
現在,如果您運行該應用程式:

node server.js

Cluster Your Node.js Application for Better Performance

您會注意到創建了多個工作進程,每個進程都有一個唯一的進程 ID。 每個請求由不同的worker處理,有效平衡負載。

您可以透過發送多個請求並觀察工作負載如何在工作人員之間分配來測試叢集如何提高應用程式的效能。

所以,下次建立高效能 Node.js 應用程式時,請記得考慮叢集!

這就是本部落格的全部內容!請繼續關注更多更新並繼續建立令人驚嘆的應用程式! ? ✨
快樂編碼! ?

版本聲明 本文轉載於:https://dev.to/jagroop2001/cluster-your-nodejs-application-for-better-performance-2ckn?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 引用計數與追蹤垃圾收集
    引用計數與追蹤垃圾收集
    你好,Mentes Tech! 您知道記憶體釋放上下文中的引用計數和引用追蹤是什麼嗎? 引用追蹤(或追蹤垃圾收集)和引用計數(引用計數)之間的區別在於每種技術用於識別和釋放不存在的物件記憶體的方法。使用時間更長。 我將解釋每一個,然後強調主要差異。 引用計數(引用計數) 工作...
    程式設計 發佈於2024-11-08
  • 單行SQL查詢失敗時如何傳回預設值?
    單行SQL查詢失敗時如何傳回預設值?
    單行查詢失敗時傳回預設值在執行SQL查詢以取得特定資料時,常會遇到沒有對應行的情況存在。為了避免傳回空結果,您可能需要提供預設值。 考慮以下 SQL 語句,該語句檢索流的下一個計劃項目:SELECT `file` FROM `show`, `schedule` WHERE `channel` = ...
    程式設計 發佈於2024-11-08
  • Cypress 自動化可訪問性測試:綜合指南
    Cypress 自動化可訪問性測試:綜合指南
    介紹 輔助功能是 Web 開發的重要方面,確保所有使用者(包括殘障人士)都可以與您的 Web 應用程式有效互動。自動化可訪問性測試有助於在開發過程的早期識別和解決可訪問性問題。在這篇文章中,我們將探討如何使用 Cypress 實現自動化可訪問性測試,利用 cypress-axe 等...
    程式設計 發佈於2024-11-08
  • 為什麼 Javascript 和 jQuery 找不到 HTML 元素?
    為什麼 Javascript 和 jQuery 找不到 HTML 元素?
    Javascript 和jQuery 無法偵測HTML 元素當嘗試使用Javascript 和jQuery 操作HTML 元素時,您可能會遇到令人沮喪的問題未定義的元素。當腳本嘗試存取 HTML 文件中尚未定義的元素時,就會發生這種情況。 在提供的 HTML 和腳本中,「script.js」檔案在其...
    程式設計 發佈於2024-11-08
  • Polars 與 Pandas Python 資料幀的新時代?
    Polars 與 Pandas Python 資料幀的新時代?
    北極熊與熊貓:有什麼區別? 如果您一直在關注 Python 的最新發展,您可能聽說過 Polars,一個用於處理資料的新程式庫。雖然 pandas 長期以來一直是首選庫,但 Polars 正在掀起波瀾,尤其是在處理大型資料集方面。那麼,Polars 有什麼大不了的呢?它和熊貓有什麼...
    程式設計 發佈於2024-11-08
  • 使用 Golang 使用 Api 閘道模式建立基本的微服務線上商店後端 - 第 1 部分
    使用 Golang 使用 Api 閘道模式建立基本的微服務線上商店後端 - 第 1 部分
    Introduction Hey, fellow developers! ? Ever thought about building a microservices architecture but felt overwhelmed by where to start? Worry...
    程式設計 發佈於2024-11-08
  • 如何有效率地尋找多個Python清單中的相交元素?
    如何有效率地尋找多個Python清單中的相交元素?
    識別多個Python列表中的共享元素在Python中,提取兩個列表的交集可以使用set.intersection()函數來實現。然而,確定多個清單的交集變得更加複雜。這是一個有效識別多個清單之間共享元素的解決方案:答案中提供的公式set.intersection(*map(set,d)) 提供了一種...
    程式設計 發佈於2024-11-08
  • 如何取得 Openpyxl 中單元格的原始值,即使它包含公式?
    如何取得 Openpyxl 中單元格的原始值,即使它包含公式?
    如何在Openpyxl 中擷取實際儲存格值使用openpyxl 存取Excel 中的儲存格值時,您可能會遇到顯示的值與儲存在Openpyxl中的實際值之間的差異單元格(如果單元格包含公式)。這是因為 openpyxl 通常會解釋公式並檢索計算結果。 要擷取實際儲存格值(包括公式),可以在載入工作簿時...
    程式設計 發佈於2024-11-08
  • Go 中如何有效率地將 UTF-8 字串轉換為位元組數組?
    Go 中如何有效率地將 UTF-8 字串轉換為位元組數組?
    將UTF-8 字串轉換為位元組陣列解組JSON 需要位元組切片輸入,而字串在Go 中儲存為UTF-8 。本文探討了 UTF-8 字串到位元組數組的高效轉換。 直接轉換Go 允許將字串轉換為位元組切片,建立字串位元組的副本:s := "some text" b := []byte(...
    程式設計 發佈於2024-11-08
  • 我如何使用 dpdm 修復 Redux 中的循環依賴錯誤
    我如何使用 dpdm 修復 Redux 中的循環依賴錯誤
    打破混亂循環:Redux 循環依賴之旅 最近,我在 Redux 程式碼庫中偶然發現了一個讓我摸不著頭緒的錯誤。如果您曾經在測試套件拋出毫無意義的錯誤時感到突然的混亂,您就會知道這種感覺。這是發生的事情以及我最終如何發現(並解決)問題的。 循環依賴到底是什麼? 當兩...
    程式設計 發佈於2024-11-08
  • 我可以在單一 MySQLi 語句中準備多個查詢嗎?
    我可以在單一 MySQLi 語句中準備多個查詢嗎?
    在單一 MySQLi 語句中準備多個查詢不可能在單一 MySQLi 語句中準備多個查詢。每個 mysqli_prepare() 呼叫只能準備一個查詢。 執行多個查詢的替代方法如果您需要一次執行多個查詢,您可以建立並為每個查詢執行單獨的mysqli_prepare() 語句。 $stmtUser = ...
    程式設計 發佈於2024-11-08
  • 在 Golang 中安全使用 Map:宣告和初始化的差異
    在 Golang 中安全使用 Map:宣告和初始化的差異
    介绍 本周,我正在为 golang 开发一个 API 包装器包,它处理发送带有 URL 编码值的 post 请求、设置 cookie 以及所有有趣的东西。但是,当我构建主体时,我使用 url.Value 类型来构建主体,并使用它来添加和设置键值对。然而,我在某些部分遇到了有线零指针...
    程式設計 發佈於2024-11-08
  • 下一個目標
    下一個目標
    我剛剛完成了我的論文,並以令人印象深刻的分數9.1/10,我對此感到非常自豪。提交給 REV-ECIT 2024 的截止日期是 9 月 30 日,目的是將我的論文變成已發表的期刊文章。目前我正在博士生導師的支持下完善我的工作,非常感謝他的指導。 ? 另外,在與SA進行了很長時間的面試後,提出了一...
    程式設計 發佈於2024-11-08
  • Better - 人工智慧驅動的程式碼審查器 GitHub Action
    Better - 人工智慧驅動的程式碼審查器 GitHub Action
    代码审查对于维护标准和强调项目中代码的最佳实践始终至关重要。这不是一篇关于开发人员应该如何审查代码的文章,更多的是关于将一​​部分代码委托给 AI。 正如 Michael Lynch 在他的文章“如何像人类一样进行代码审查”中提到的那样——我们应该让计算机处理代码审查的无聊部分。虽然迈克尔强调格式化...
    程式設計 發佈於2024-11-08
  • 如何使用 Java 8 有效統計列表中的詞頻?
    如何使用 Java 8 有效統計列表中的詞頻?
    使用 Java 8 計算詞頻在 Web 開發和資料分析中,理解詞頻至關重要。為了實現這一目標,我們將深入研究如何使用 Java 8 計算清單中單字的頻率。 Java 8 解決方案Java 8 中的 Stream API 為單字提供了一個優雅的解決方案頻率計數。首先,建立一個單字清單:List<...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3