当前位置: 首页 > 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;如果没有操作…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

对WWDC 2025 Keynote 内容的预测

借助我们以往对苹果公司发展路径的深入研究经验&#xff0c;以及大语言模型的分析能力&#xff0c;我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际&#xff0c;我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测&#xff0c;聊作存档。等到明…...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

HashMap中的put方法执行流程(流程图)

1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中&#xff0c;其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下&#xff1a; 初始判断与哈希计算&#xff1a; 首先&#xff0c;putVal 方法会检查当前的 table&#xff08;也就…...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

搭建DNS域名解析服务器(正向解析资源文件)

正向解析资源文件 1&#xff09;准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2&#xff09;服务端安装软件&#xff1a;bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...