当前位置: 首页 > news >正文

node.js之---集群(Cluster)模块

为什么会有集群(Cluster)模块?

集群(Cluster)模块的作用

如何使用集群(Cluster)模块?

为什么会有集群(Cluster)模块

Node.js 是基于 单线程事件驱动 模型的,这意味着每个 Node.js 进程只会在一个 CPU 核心上运行。虽然 Node.js 的事件循环模型非常适合处理 I/O 密集型的操作,但它在 CPU 密集型任务(例如复杂的计算、数据处理等)上的表现不如多核处理器那样高效。

问题背景:
  1. 单线程限制

    • Node.js 默认是单线程的,所有任务都由一个线程处理。对于大规模的并发请求,Node.js 可以高效地处理 I/O 请求,但在处理计算密集型任务时,单线程的性能可能无法满足需求。
  2. 多核处理器的未利用

    • 现代服务器通常配备多核处理器,多个 CPU 核心可以并行处理任务。Node.js 只使用一个核心,导致其无法充分利用多核处理器的性能优势。

因此,为了更好地利用服务器的硬件资源,并在多核环境中实现高并发和高性能,Node.js 提供了 集群(Cluster)模块,允许通过多个进程来并行工作,充分利用多核 CPU。

集群(Cluster)模块的作用

Node.js 集群模块提供了一个 多进程并发 机制,通过多个工作进程来分担主进程的负载。集群模块能够让 Node.js 应用同时在多个 CPU 核心上运行,从而提升应用的吞吐量和性能。

具体来说,集群模块的作用可以分为以下几个方面:

1. 提升性能与并发能力
  • 多进程并行:集群模块可以启动多个工作进程,每个工作进程都能独立地处理请求,从而充分利用服务器的多核 CPU。每个工作进程都可以处理自己的请求,主进程负责协调和管理这些工作进程。
  • 负载均衡:集群模块通过操作系统的负载均衡机制(例如 Linux 上的 SO_REUSEPORT)来自动将流量分发到多个工作进程,避免某个进程过载,提升系统的整体并发处理能力。
2. 增强应用的可扩展性
  • 横向扩展:通过集群模块,Node.js 可以非常方便地将应用部署在多个进程中,而不需要改变应用的代码逻辑。这使得应用能够轻松地在多核服务器上扩展,甚至在云平台上分布式部署时更加灵活。
  • 进程管理:主进程负责创建和管理多个工作进程,并且能够自动监控工作进程的状态。当工作进程出现异常或崩溃时,主进程可以自动重启这些进程,确保应用的高可用性。
3. 提高可靠性与容错性
  • 容错机制:集群模块能够监控工作进程的状态。如果某个工作进程崩溃或异常退出,主进程可以自动重新启动它。这种容错机制提高了应用的可靠性,确保它在出现问题时不会彻底宕机。
  • 平滑重启:在需要更新或维护时,集群模式可以实现平滑重启,主进程可以逐步重启工作进程,不会影响系统的稳定性和服务的可用性。
4. 使得 Node.js 更适合多核系统
  • Node.js 本身是单线程的,这意味着它不能直接利用多个 CPU 核心。集群模块通过创建多个工作进程,使得每个进程运行在不同的核心上,从而使得 Node.js 可以在多核服务器上充分发挥性能。
5. 提供进程间通信(IPC)
  • 集群模块允许主进程和工作进程之间进行 进程间通信(IPC)。工作进程可以通过 process.send() 向主进程发送消息,主进程也可以向工作进程发送命令或数据。这为进程间的协调和状态管理提供了有效的手段。

总结:集群模块的作用

  • 负载均衡:将客户端请求分配到多个工作进程,确保每个进程都有相对均衡的负载。
  • 多核利用:使 Node.js 能够充分利用多核处理器,提升应用的并发处理能力和整体性能。
  • 容错和高可用性:确保即使某些工作进程崩溃,应用仍能正常运行,自动重启失败的进程。
  • 可扩展性:方便应用横向扩展,能够动态增加或减少工作进程,适应不同的负载需求。
  • 进程间通信:允许主进程和工作进程之间进行有效的通信和协调。

如何使用集群(Cluster)模块

1. 基本概念

  • 主进程(Master Process):负责启动和管理工作进程,处理负载均衡和进程监控。
  • 工作进程(Worker Processes):每个工作进程都有自己的事件循环和 HTTP 服务器,负责处理实际的请求。
  • 主进程和工作进程之间可以通过 进程间通信(IPC) 进行通信。

2、Cluster模块

  • cluster.isMaster:判断当前进程是否是主进程。
  • cluster.fork():在主进程中创建新的工作进程。
  • cluster.on('exit', callback):监听工作进程退出事件,可以进行容错处理。
  • process.send():主进程和工作进程之间的通信。

Cluster模块使用代码

const cluster = require('cluster');
const http = require('http');
const os = require('os');// 获取 CPU 核心数
const numCPUs = os.cpus().length;if (cluster.isMaster) {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 {// 工作进程处理请求http.createServer((req, res) => {res.writeHead(200);res.end(`请求由工作进程 ${process.pid} 处理`);}).listen(8000, () => {console.log(`工作进程 ${process.pid} 已启动,监听端口 8000`);});
}

相关文章:

node.js之---集群(Cluster)模块

为什么会有集群&#xff08;Cluster&#xff09;模块&#xff1f; 集群&#xff08;Cluster&#xff09;模块的作用 如何使用集群&#xff08;Cluster&#xff09;模块&#xff1f; 为什么会有集群&#xff08;Cluster&#xff09;模块 Node.js 是基于 单线程事件驱动 模型的…...

SSM-Spring-IOC/DI对应的配置开发

目录 一、IOC 控制反转 1.什么是控制反转呢 2. Spring和IOC之间的关系是什么呢? 3.IOC容器的作用以及内部存放的是什么? 4.当IOC容器中创建好service和dao对象后&#xff0c;程序能正确执行么? 5.Spring 容器管理什么内容&#xff1f; 6.如何将需要管理的对象交给 …...

一文大白话讲清楚CSS元素的水平居中和垂直居中

文章目录 一文大白话讲清楚CSS元素的水平居中和垂直居中1.已知元素宽高的居中方案1.1 利用定位margin:auto1.2 利用定位margin负值1.3 table布局 2.未知元素宽高的居中方案2.1利用定位transform2.2 flex弹性布局2.3 grid网格布局 3. 内联元素的居中布局 一文大白话讲清楚CSS元素…...

航顺芯片推出HK32A040方案,赋能汽车矩阵大灯安全与智能化升级

汽车安全行驶对整车照明系统的要求正在向智能化方向发展。车灯位于汽车两侧&#xff0c;前期有各种各样的实现包括氙气灯、LED灯等等光源技术。矩阵大灯对汽车照明系统朝着安全性和智能化兼具的方向发展起到了重要推动作用。矩阵大灯可以精细控制到每一个小灯珠&#xff0c;从而…...

智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之12 方案再探:特定于领域的模板 之2 首次尝试和遗留问题解决

本文提要 现在就剩下“体”本身的 约定了--这必然是 自律自省的&#xff0c;或者称为“戒律” --即“体”的自我训导discipline。完整表述为&#xff1a; 严格双相的庄严“相” (<head>侧&#xff09;&#xff0c;完全双性的本质“性”&#xff08;<boot>侧&…...

redis zset底层实现

1.Redis zset底层实现 转载自&#xff1a;https://marticles.github.io/2019/03/19/%E6%B7%B1%E5%85%A5%E7%90%86%E8%A7%A3Redis-Zset%E5%8E%9F%E7%90%86/ zset底层是压缩列表 跳表实现的。 跳表里面又由字典hash表 跳表实现。 什么时候用压缩列表&#xff1f;什么时候用…...

go.Bar如何让hovertext显示为legend

在 Plotly 的 go.Bar 图中&#xff0c;如果你想让鼠标悬停时 (hover) 显示的文本 (hovertext) 与图例 (legend) 一致&#xff0c;可以通过 hovertemplate 来控制悬停时的显示内容。 实现方法 hovertemplate 是一种自定义工具&#xff0c;允许你完全控制悬停时的文本显示格式。…...

【Vue】分享一个快速入门的前端框架以及如何搭建

先上效果图: 登录 菜单: 下载地址: 链接&#xff1a;https://pan.baidu.com/s/1m-ZlBARWU6_2n8jZil_RAQ 提取码&#xff1a;ui20 … 主要是可以自定义设置token,更改后端请求地址较为方便。 应用设置: 登录与token设置: 在这里设置不用登录,可以请求的接口: request.js i…...

Flink源码解析之:如何根据JobGraph生成ExecutionGraph

Flink源码解析之&#xff1a;如何根据JobGraph生成ExecutionGraph 在上一篇Flink源码解析中&#xff0c;我们介绍了Flink如何根据StreamGraph生成JobGraph的流程&#xff0c;并着重分析了其算子链的合并过程和JobGraph的构造流程。 对于StreamGraph和JobGraph的生成来说&…...

UE(虚幻)学习(三) UnrealSharp插件中调用非托管DLL

上一篇文章中我使用UnrealSharp成功使用了我的一个C#控制台程序中的网络模块&#xff0c;这个程序是基于KCP网络了&#xff0c;其中调用了Cmake 编译的一个C的DLL&#xff0c;在虚幻中DLL需要放在Binaries目录中才可以。Unity中只要放在任意Plugins目录中就可以。 但是Binaries…...

leetcode 3219. 切蛋糕的最小总开销 II

题目&#xff1a;3219. 切蛋糕的最小总开销 II - 力扣&#xff08;LeetCode&#xff09; 排序贪心。 开销越大的越早切。 注意m或n为1的情况。 class Solution { public:long long minimumCost(int m, int n, vector<int>& horizontalCut, vector<int>&…...

vant 地址记录

vant ui 的官网地址记录 vant 4 Vant 4 - A lightweight, customizable Vue UI library for mobile web apps. vant2 https://vant-ui.github.io/vant/v2/ vant3 Vant 3 - Lightweight Mobile UI Components built on Vue...

Lua语言入门 - Lua常量

在Lua中&#xff0c;虽然没有直接的常量关键字&#xff08;如C中的const&#xff09;&#xff0c;但你可以通过一些编程技巧和约定来实现类似常量的行为。以下是几种常见的方法&#xff1a; 1. 使用全局变量并命名规范 你可以定义一个全局变量&#xff0c;并通过命名约定来表示…...

在Microsoft Windows上安装MySQL

MySQL仅适用于Microsoft Windows 64位操作系统&#xff0c;在Microsoft Windows上安装MySQL有不同的方法&#xff1a;MSI、包含您解压缩的所有必要文件的标准二进制版本&#xff08;打包为压缩文件&#xff09;以及自己编译MySQL源文件。 注意&#xff1a;MySQL8.4服务器需要在…...

windows下vscode使用msvc编译器出现中文乱码

文章目录 [toc]1、概述2、修改已创建文件编码3、修改vscode默认编码 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;C &#x1f448;&#x1f449;开发工具 &#x1f448; 1、概述 在使用MSVC编译器时&#xff0c;出现中文报错的问题可能与编码格式有关。UTF-…...

Git 解决 everything up-to-date

首先使用git log查看历史提交&#xff0c;找到最新一次提交&#xff0c;比如&#xff1a; PS D:\Unity Projects\CoffeeHouse\CoffeeHouse_BurstDebugInformation_DoNotShip> git log commit a1b54c309ade7c07c3981d3ed748b0ffac2759a3 (HEAD -> master, origin/master)…...

Windows配置cuda,并安装配置Pytorch-GPU版本

文章目录 1. CUDA Toolkit安装2. 安装cuDNN3. 添加环境变量配置Pytorch GPU版本 博主的电脑是Windows11&#xff0c;在安装cuda之前&#xff0c;请先查看pytorch支持的版本&#xff0c;cuda可以向下兼容&#xff0c;但是pytorch不行&#xff0c;请先进入&#xff1a;https://py…...

Neo4j 图数据库安装与操作指南(以mac为例)

目录 一、安装前提条件 1.1 Java环境 1.2 Homebrew&#xff08;可选&#xff09; 二、下载并安装Neo4j 2.1 从官方网站下载 2.1.1 访问Neo4j的官方网站 2.1.2 使用Homebrew安装 三、配置Neo4j 3.1 设置环境变量(可选) 3.2 打开配置文件(bash_profile) 3.2.1 打开终端…...

2024年12月个人工作生活总结

本文为 2024年12月工作生活总结。 研发编码 Golang语言byte数组赋值 假定有如下变量&#xff1a; var strCode string var bCode [9]byte现需将string类型转换成byte类型&#xff0c;如下&#xff1a; bCode []byte(strCode)无法转换&#xff0c;提示&#xff1a; cannot…...

PHP:IntelliJ IDEA 配置 PHP 开发环境及导入PHP项目

在创建PHP项目之前我们需要安装PHP插件&#xff0c;安装步骤如下&#xff1a;Windows&#xff1a;IntelliJ IDEA Ultimate 安装 PHP 插件-CSDN博客 1、导入已有PHP项目&#xff0c;导入之后选择&#xff0c;File > Setting 选择对应CLL Interpreter&#xff0c;如果没有操作…...

idea大量爆红问题解决

问题描述 在学习和工作中&#xff0c;idea是程序员不可缺少的一个工具&#xff0c;但是突然在有些时候就会出现大量爆红的问题&#xff0c;发现无法跳转&#xff0c;无论是关机重启或者是替换root都无法解决 就是如上所展示的问题&#xff0c;但是程序依然可以启动。 问题解决…...

ssc377d修改flash分区大小

1、flash的分区默认分配16M、 / # df -h Filesystem Size Used Available Use% Mounted on /dev/root 1.9M 1.9M 0 100% / /dev/mtdblock4 3.0M...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

代码规范和架构【立芯理论一】(2025.06.08)

1、代码规范的目标 代码简洁精炼、美观&#xff0c;可持续性好高效率高复用&#xff0c;可移植性好高内聚&#xff0c;低耦合没有冗余规范性&#xff0c;代码有规可循&#xff0c;可以看出自己当时的思考过程特殊排版&#xff0c;特殊语法&#xff0c;特殊指令&#xff0c;必须…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...

【版本控制】GitHub Desktop 入门教程与开源协作全流程解析

目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork&#xff08;创建个人副本&#xff09;步骤 2: Clone&#xff08;克隆…...