【Nodejs-多進程之Cluster】

cluster 模塊是 Node.js 提供的一個用于多進程的模塊,它可以輕松地創建一組共享同一個服務器端口的子進程(worker進程)。通過使用 cluster 模塊,可以充分利用多核系統,提高應用程序的性能和可靠性。

基本原理

cluster 模塊基于 child_process 模塊,但它專門設計用于創建多個 Node.js 進程(worker進程),這些進程可以共享同一個服務器端口。它通過主進程(主進程)和工作進程的模型來實現這一點:

  • 主進程:負責管理所有的工作進程。
  • 工作進程:處理實際的客戶端請求。

主進程可以根據需要啟動和管理多個工作進程。每個工作進程都是一個獨立的 Node.js 進程。

注意關于連接:實際cluster module支持兩種連接處理方式。

  • 一種是由master監聽并分發給worker,拿到worker結果后在返回給請求端。 這樣master和請求端之間是http通信,master和worker之間是IPC通信,master類似一個agent,用于連接請求端和worker之間。(注:進程間通信IPC?- Interprocess communication)
  • 一種是master監聽后通知相關worker,worker直接連接connection到請求端進行交互。

第二種看起來性能更好,但在實際中由于系統調度等原因表現不佳,無法做到很好的負載,所以一般用第一種。(refs: https://nodejs.org/api/cluster.html#cluster_how_it_works)

圖示

使用 cluster 模塊的基本步驟

  1. 檢查是否是主進程:使用 cluster.isMastercluster.isPrimary 檢查當前進程是否是主進程。
  2. 主進程創建工作進程:如果是主進程,創建工作進程。
  3. 工作進程執行服務器代碼:如果是工作進程,執行服務器代碼。

以下是一個示例,展示如何使用 cluster 模塊創建一個簡單的 HTTP 服務器,該服務器可以使用多個工作進程來處理請求:

const cluster = require("node:cluster");
const http = require("node:http");
const numCPUs = require("node:os").cpus().length;if (cluster.isPrimary) {console.log(`主進程 ${process.pid} 正在運行`);// 根據 CPU 核心數創建工作進程for (let i = 0; i < numCPUs; i++) {cluster.fork();}cluster.on("exit", (worker, code, signal) => {console.log(`工作進程 ${worker.process.pid} 已退出`);});
} else {// 工作進程可以共享任何 TCP 連接// 在本例中是一個 HTTP 服務器http.createServer((req, res) => {let workerPid = process.pid;res.writeHead(200);res.end(`hello world, I am worker ${workerPid}\\n`);}).listen(8000);console.log(`工作進程 ${process.pid} 已啟動`);
}

cluster優勢

  • 性能提升:通過使用多個工作進程,可以充分利用多核 CPU,提升應用的并發處理能力。
  • 可靠性:如果一個工作進程崩潰,不會影響其他工作進程,主進程可以重啟崩潰的工作進程。
  • 負載均衡:多個工作進程可以共享同一個服務器端口,自動實現負載均衡。

總結

cluster 模塊提供了一種簡單而強大的方式來實現 Node.js 應用的多進程處理,從而提高性能和可靠性。通過主進程和工作進程的模型,可以輕松地創建和管理多個工作進程,并讓它們共享同一個服務器端口以處理高并發請求。

最后思考

最后留個思考問題,大家有沒想過對于http服務,比如下面這個啟動http server監聽8000端口, nodejs cluster 里面可以起多個子進程, 但是如果分別起2個進程監聽相同端口 比如下面這個代碼連續執行兩次,則后啟動的進程會提示端口被占用,這是為什么 ?

有知道的小伙伴歡迎評論區留言,也歡迎大家多多點贊,點贊過20個,公布答案。

//  httpServer.js
const http = require("node:http");
http.createServer((req, res) => {let workerPid = process.pid;res.writeHead(200);res.end(`hello world, I am worker ${workerPid}\n`);}).listen(8000);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/14717.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/14717.shtml
英文地址,請注明出處:http://en.pswp.cn/web/14717.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

#php把pdf文件轉成圖片#

本地環境 系統&#xff1a;win11 64位 環境&#xff1a;phpStudy PHP版本&#xff1a;8.0.2 礦建&#xff1a;laravel 配置擴展 一、安裝imageMagick 下載地址&#xff1a;https://imagemagick.org/script/download.php 安裝版本&#xff1a;ImageMagick-最新版本-Q16-HDRI-x64…

Docker: exec命令淺析

簡介 Docker exec命令是Docker提供的一個強大工具&#xff0c;用于在正在運行的容器中執行命令。在此將介紹Docker exec命令的用法和示例&#xff0c;幫助大家更好地理解和使用這個命令。 Docker是一種流行的容器化平臺&#xff0c;允許用戶在容器中運行應用程序。有時候&#…

React開發環境配置詳細講解-04

React環境 前端隨著規范化&#xff0c;可以說規范和環境插件配置滿天飛&#xff0c;筆者最早接觸的是jquery&#xff0c;那個開發非常簡單&#xff0c;只要引入jquery就可以了&#xff0c;當時還寫了一套UI框架&#xff0c;至今在做小型項目中還在使用&#xff0c;show一張效果…

一款顏值頗高的虛擬列表!差點就被埋沒了,終于還是被我挖出來了

大家好&#xff0c;我是曉衡&#xff01; 今天&#xff0c;推薦一款頗有顏值的虛擬列表組件&#xff0c;不然真的被埋沒就可惜了&#xff01; 我們先來看下效果&#xff1a; 感覺怎么樣&#xff1f;還不錯吧&#xff01; 為什么說這個資源差點被埋沒呢&#xff1f;因為個朋友找…

用數據,簡單點!奇點云2024 StartDT Day數智科技大會,直播見

在充滿挑戰的2024&#xff0c;企業如何以最小化的資源投入和試錯成本&#xff0c;挖掘新的增長機會&#xff0c;實現確定性發展&#xff1f; “簡單點”是當前商業環境的應對策略&#xff0c;也是奇點云2024 StartDT Day的核心理念。 5月28日&#xff0c;由奇點云主辦的2024 S…

Linux —— 信號量

Linux —— 信號量 什么是信號量P操作&#xff08;Wait操作&#xff09;V操作&#xff08;Signal操作&#xff09;信號量的類型 一些接口POSIX 信號量接口&#xff1a;其他相關命令&#xff1a; 基于循環隊列的生產者和消費者模型同步關系 多生產多消費 我們今天接著來學習信號…

【譯】組復制和 Percona XtraDB 集群: 常見操作概述

原文地址&#xff1a;Group Replication and Percona XtraDB Cluster: Overview of Common Operations 在這篇博文中&#xff0c;我將概述使用 MySQL Group Replication 8.0.19&#xff08;又稱 GR&#xff09;和 Percona XtraDB Cluster 8 (PXC)&#xff08;基于 Galera&…

Jetbrains插件AI Assistant,終于用上了

ai assistant激活成功后&#xff0c;如圖 ai assistant獲取&#xff1a;https://web.52shizhan.cn/activity/ai-assistant 主要功能如下

Spring Boot 配置使用 PEM 格式SSL/TLS證書和私鑰

傳統的為 Spring Boot 配置SSL/TLS證書一般都會把證書打包成 JKS(Java KeyStore) 或 PKCS12 (Public Key Cryptographic Standards) 格式&#xff0c;然后為Spring Boot 增加以下類似配置&#xff1a; # The format used for the keystore. It could be set to JKS in case it…

SpringBoot(六)之內嵌容器

SpringBoot&#xff08;六&#xff09;之內嵌容器 文章目錄 SpringBoot&#xff08;六&#xff09;之內嵌容器內嵌容器的特點如何替換默認容器1.pom形式2.主動配置 如何通過配置切換serlvet容器 Spring Boot 提供了一種便捷的方式來創建獨立運行的 Spring 應用程序&#xff0c;…

計算機畢業設計hadoop+spark微博輿情大數據分析 微博爬蟲可視化 微博數據分析 微博采集分析平臺 機器學習(大屏+LSTM情感分析+爬蟲)

電商數據建模 一、分析背景與目的 1.1 背景介紹 電商平臺數據分析是最為典型的一個數據分析賽道&#xff0c;且電商數據分析有著比較成熟的數據分析模型&#xff0c;比如&#xff1a;人貨場模型。此文中我將通過分析國內最大的電商平臺——淘寶的用戶行為&#xff0c;來鞏固數…

算法打卡 Day13(棧與隊列)-滑動窗口最大值 + 前 K 個高頻元素 + 總結

文章目錄 Leetcode 239-滑動窗口最大值題目描述解題思路 Leetcode 347-前 K 個高頻元素題目描述解題思路 棧與隊列總結 Leetcode 239-滑動窗口最大值 題目描述 https://leetcode.cn/problems/sliding-window-maximum/description/ 解題思路 在本題中我們使用自定義的單調隊列…

C語言指針指針和數組筆試題(必看)

前言&#xff1a; 前面介紹了指針的大體內容&#xff0c;如果接下來能夠把這些代碼的含義搞得清清楚楚&#xff0c;那么你就是代碼king&#xff01; 一維數組&#xff1a; int a[] {1,2,3,4}; printf("%d\n",sizeof(a)); printf("%d\n",sizeof(a0)); pr…

element-ui輸入框和多行文字輸入框字體不一樣解決

element-ui的type"textarea"的字體樣式與其他樣式不同 <el-input type"textarea"></el-input> <el-input ></el-input>設置&#xff1a; .el-textarea__inner::placeholder {font-family: "Helvetica Neue", Helvetic…

linux排查思路

1.賬號安全 who 查看當前登錄用戶&#xff08;tty本地登錄pts遠程登錄&#xff09; w 查看系統信息&#xff0c;想知道某一時刻用戶的行為 uptime 查看登錄多久、多少用戶&#xff0c;負載 1.查看用戶信息文件/etc/passwd root:x:0:0:root:/root:/bin:/b…

刪除MySQL中所有表的外鍵

方法一&#xff1a; 原理 查詢schema中所有外鍵名稱然后拼接生成刪除語句 第一步&#xff1a; SELECT CONCAT(ALTER TABLE ,TABLE_SCHEMA,.,TABLE_NAME, DROP FOREIGN KEY ,CONSTRAINT_NAME, ;) FROM information_schema.TABLE_CONSTRAINTS c WHERE c.TABLE_SCHEMA數據庫名…

Vue 跨域代理設置

Vue CLI允許你通過項目根目錄下的vue.config.js文件來定制devServer的配置。以下是一些常見的配置示例&#xff1a; module.exports {devServer: {// 跨域代理配置&#xff0c;解決開發環境API跨域問題proxy: {//匹配以api路徑請求的URL&#xff0c;轉發請求的服務器地址/api…

課時135:awk實踐_邏輯控制_綜合實踐

1.3.8 綜合實踐 學習目標 這一節&#xff0c;我們從 網絡實踐、文件實踐、小結 三個方面來學習 網絡實踐 簡介 所謂的網絡實踐&#xff0c;主要是借助于awk的數組功能&#xff0c;進行站點的信息統計操作。準備網絡環境 安裝軟件 yum install nignx -y重啟nginx [rootloca…

Linux修煉之路之自動化構建工具,進度條,gdb調試器

目錄 一&#xff1a;自動化構建工具make/makefile 生成內容&#xff1a; 清理內容&#xff1a; 對于多過程的&#xff1a; 對于多次make&#xff1a; 特殊符號&#xff1a; 二&#xff1a;小程序之進度條 三&#xff1a;git的簡單介紹 四&#xff1a;Linux調試器gdb 接…