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`);
  });
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/948062.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM(十二)| DeepSeek-V3 技术报告深度解读——开源模型的巅峰之作

近年来&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展突飞猛进&#xff0c;逐步缩小了与通用人工智能&#xff08;AGI&#xff09;的差距。DeepSeek-AI 团队最新发布的 DeepSeek-V3&#xff0c;作为一款强大的混合专家模型&#xff08;Mixture-of-Experts, MoE&a…

手机租赁平台开发实用指南与市场趋势分析

内容概要 在当今快速变化的科技时代&#xff0c;手机租赁平台的发展如火如荼。随着越来越多的人希望使用最新款的智能手机&#xff0c;但又不愿意承担昂贵的购机成本&#xff0c;手机租赁平台应运而生。这种模式不仅为用户提供了灵活的选择&#xff0c;还为企业创造了新的商机…

【大模型】7 天 AI 大模型学习

7 天 AI 大模型学习 Day 2 今天是 7 天AI 大模型学习的第二天 &#x1f604;&#xff0c;今天我将会学习 Transformer 、Encoder-based and Decoder-Based LLMs 等 。如果有感兴趣的&#xff0c;就和我一起开始吧 &#xff5e; 课程链接 &#xff1a;2025年快速吃透AI大模型&am…

Vue3 中的插槽

Vue3 中插槽的使用&#xff0c;插槽是 Vue 中的一个特别特性&#xff0c;插槽就是模版内容。例如<h1>标题 1</h1>标题 1 就是插槽&#xff0c;Vue 是无法识别模板内容的&#xff0c;只能通过属性进行传递。Slot 主要包括默认、具名和作用域。Slot开发起来难度不大&…

JAVA-制作小游戏期末实训

源码 import game.frame.Frame;public class App {public static void main(String[] args) {System.out.println("starting......");new Frame();} } package game.controller;import game.model.Enemy;public class EnemyController implements Runnable{private…

Linux Red Hat 7.9 Server安装GitLab

1、关闭防火墙 执行 systemctl disable firewalld 查看服务器状态 systemctl status firewalld 2、禁用selinux vi /etc/selinux/config 将SELINUX 的值改为 disabled 3、安装policycoreutils-python 执行 yum install policycoreutils-python 4、下载gitlab wget --co…

Windows 环境配置 HTTPS 服务实战

一、 环境准备 win10以上操作系统安装 Certbot申请阿里云\腾讯云域名安装 nginx 1.3以上版本 二、Certbot 安装及 SSL 证书生成 Certbot 是一个免费、开源工具&#xff0c;用于自动化在Web服务器上获取和更新SSL/TLS证书。它可以通过Let’s Encrypt服务获取免费的SSL/TLS证书…

普及组集训数据结构--并查集

P1551 亲戚 - 洛谷 | 计算机科学教育新生态 并查集就是把所有相关联的量串成一串珠子&#xff0c;抽象来说就是&#xff1a; 把此类相关联的量当作节点&#xff0c;两个节点之间连接一条无向边&#xff0c;所形成的图 例题算法流程&#xff1a; 在此定义“族长”就是一个树的…

windows编译llama.cpp GPU版本

Build 指南 https://github.com/ggerganov/llama.cpp/blob/master/docs/build.md 一、Prerequire 具体步骤&#xff08;以及遇到的坑&#xff09;&#xff1a; 如果你要使用CUDA&#xff0c;请确保已安装。 1.安装 最新的 cmake, git, anaconda&#xff0c; pip 配置pyt…

Android 性能优化:内存优化(实践篇)

1. 前言 前一篇文章Android性能优化&#xff1a;内存优化 &#xff08;思路篇&#xff09; 大概梳理了Android 内存原理和优化的必要性及应该如何优化&#xff0c;输出了一套短期和长期内存优化治理的SOP方案。 那么这一篇文章就总结下我最近在做内存优化如何实践的&#xff0…

「Mac畅玩鸿蒙与硬件53」UI互动应用篇30 - 打卡提醒小应用

本篇教程将实现一个打卡提醒小应用&#xff0c;通过用户输入时间进行提醒设置&#xff0c;并展示实时提醒状态&#xff0c;实现提醒设置和取消等功能。 关键词 打卡提醒状态管理定时任务输入校验UI交互 一、功能说明 打卡提醒小应用包含以下功能&#xff1a; 提醒时间输入与…

Nginx知识详解(理论+实战更易懂)

目录 一、Nginx架构和安装 1.1 Nginx 概述 1.1.1 nginx介绍 1.1.2?Nginx 功能介绍 1.1.3?基础特性 1.1.4?Web 服务相关的功能 1.2?Nginx 架构和进程 1.2.1?Nginx 进程结构 1.2.2?Nginx 进程间通信 1.2.3?Nginx 启动和 HTTP 连接建立 1.2.4?HTTP 处理过程 1…

Postgresql 命令还原数据库

因为PgAdmin打不开&#xff0c;但是数据库已经安装成功了&#xff0c;这里借助Pg命令来还原数据库 C:\Program Files\PostgreSQL\15\bin\psql.exe #链接数据库 psql -U postgres -p 5432#创建数据库 CREATE DATABASE "数据库名称"WITHOWNER postgresENCODING UTF8…

Vue 解决浏览器刷新路由参数丢失问题 全局统一配置无需修改组件

在路由跳转的时候,我们经常会传一些参数过去,然后通过传过来的参数调用接口获取相关数据,但是刷新浏览器的时候路由参数会丢失。此时页面报错误了,如何通过全局配置的方式,不需要修改任何组件 实现刷新浏览器保存参数? 实现方式如下: 首先在router/index.js里添加参数管…

【AIGC】电话录音转文字实践:基于Google Cloud Speech-to-Text-v1的技术方案Python

文章目录 引言技术原理技术方案设计系统架构关键技术要点 代码实现1. 环境准备2. 核心代码实现3. 音频预处理工具响应格式 性能优化实践经验应用场景未来展望总结 引言 在当今数字化时代&#xff0c;将语音内容转换为文字已经成为一个非常重要的技术需求。无论是客服通话记录、…

RabbitMQ-基本使用

RabbitMQ: One broker to queue them all | RabbitMQ 官方 安装到Docker中 docker run \-e RABBITMQ_DEFAULT_USERrabbit \-e RABBITMQ_DEFAULT_PASSrabbit \-v mq-plugins:/plugins \--name mq \--hostname mq \-p 15672:15672 \-p 5672:5672 \--network mynet\-d \rabbitmq:3…

Android Camera压力测试工具

背景描述&#xff1a; 随着系统的复杂化和业务的积累&#xff0c;日常的功能性测试已不足以满足我们对Android Camera相机系统的测试需求。为了确保Android Camera系统在高负载和多任务情况下的稳定性和性能优化&#xff0c;需要对Android Camera应用进行全面的压测。 对于压…

vscode中调用deepseek实现AI辅助编程

来自 Python大数据分析 费弗里 1 简介 大家好我是费老师&#xff0c;最近国产大模型Deepseek v3新版本凭借其优秀的模型推理能力&#xff0c;讨论度非常之高&#x1f525;&#xff0c;且其官网提供的相关大模型API接口服务价格一直走的“价格屠夫”路线&#xff0c;性价比很高…

基于 LMS 算法的离散傅里叶分析器

基于 LMS&#xff08;Least Mean Squares&#xff0c;最小均方&#xff09;算法的离散傅里叶分析器是一种结合自适应滤波和频域分析的工具&#xff0c;用于动态估计信号的频谱成分。它将 LMS 自适应算法与离散傅里叶变换&#xff08;DFT&#xff09;的频率分解能力结合&#xf…

2022浙江大学信号与系统笔记

原视频地址&#xff1a;2022浙江大学信号与系统&#xff08;含配套课件和代码&#xff09; - 胡浩基老师-哔哩哔哩 ⭐⭐⭐ 我的笔记&#xff1a;飞书链接 - 信号与系统 基于视频&#xff0c;记得笔记&#xff0c;加了点自己的补充&#xff08;有的是问 ChatGPT 的&#xff09;…