【Nodejs-多进程之Cluster】

news2025/1/10 23:33:17

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.coloradmin.cn/o/1692157.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

文心智能体,零代码构建情感表达大师智能体

前言 随着智能体技术的突飞猛进&#xff0c;各行各业正迎来前所未有的变革与机遇。智能体&#xff0c;作为人工智能领域的重要分支&#xff0c;以其自主性、智能性和适应性&#xff0c;正逐步渗透到我们生活的每一个角落&#xff0c;成为推动社会进步和科技发展的新动力。 为了…

秒级达百万高并发框架Disruptor

1、起源 Disruptor最初由lmax.com开发&#xff0c;2010年在Qcon公开发表&#xff0c;并于2011年开源&#xff0c;企业应用软件专家Martin Fowler专门撰写长文介绍&#xff0c;同年它还获得了Oracle官方的Duke大奖。其官网定义为&#xff1a;“High Performance Inter-Thread M…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(十九)- JUC(5)

synchronized优化原理 轻量级锁 如果一个对象有多个线程访问&#xff0c;但多线程访问的时间是错开的&#xff08;没有竞争&#xff09;&#xff0c;可以用轻量级锁优化 Slf4j(topic "c.ExerciseTransfer")public class Test {​static final Object obj new Obj…

利用天气API接口自己DIY一个预报小管家

天气预报查询API 是一种实用的日常工具&#xff0c;它通过编程方式为开发者提供实时的天气数据。开发者可以通过简单的代码调用&#xff0c;与天气预报服务提供商进行交互&#xff0c;获取特定地区的天气信息&#xff0c;如温度、湿度、风速、风向、降水量等&#xff0c;以及未…

【智能优化算法】粒子群优化算法(PSO)【附python实现代码】

写在前面&#xff1a; 首先感谢兄弟们的订阅&#xff0c;让我有创作的动力&#xff0c;在创作过程我会尽最大能力&#xff0c;保证作品的质量&#xff0c;如果有问题&#xff0c;可以私信我&#xff0c;让我们携手共进&#xff0c;共创辉煌。 路虽远&#xff0c;行则将至&#…

微信小程序上线必备:SSL证书申请以及安装

一、认识ssl证书 1、ssl证书是什么&#xff1f; SSL证书&#xff0c;全称Secure Socket Layer Certificate&#xff0c;是一种数字证书&#xff0c;它遵循SSL&#xff08;现在通常指TLS&#xff0c;Transport Layer Security&#xff09;协议标准&#xff0c;用于在客户端&…

ElasticSearch - 删除已经设置的认证密码(7.x)

文章目录 Pre版本号 7.x操作步骤检查当前Elasticsearch安全配置停止Elasticsearch服务修改Elasticsearch配置文件删除密码重启Elasticsearch服务验证配置 小结 Pre Elasticsearch - Configuring security in Elasticsearch 开启用户名和密码访问 版本号 7.x ES7.x 操作步骤 …

1小时从0开始搭建自己的直播平台(详细步骤)

本文讲述了如何从0开始&#xff0c;利用腾讯云的平台&#xff0c;快速搭建一个直播平台的过程。 文章目录 效果图详细步骤准备工作第一步&#xff1a;添加域名并检验cname配置1.先填加一个推流域名2. 点击完下一步&#xff0c;得到一个cname地址3. 将cname地址&#xff0c;配置…

A股重磅!史上最严减持新规,发布!

此次减持新规被市场视为A股史上最严、最全面的规则&#xff0c;“花式”减持通道被全面“封堵”。 5月24日晚间&#xff0c;证监会正式发布《上市公司股东减持股份管理暂行办法》&#xff08;以下简称《减持管理办法》&#xff09;及相关配套规则。 据了解&#xff0c;《减持…

开放式耳机哪个品牌音质好用又实惠耐用?五大公认卷王神器直入!

​在现今耳机市场&#xff0c;开放式耳机凭借其舒适的佩戴体验和独特的不入耳设计&#xff0c;备受消费者追捧。它们不仅让你在享受音乐时&#xff0c;仍能察觉周围的声音&#xff0c;确保与人交流无障碍&#xff0c;而且有利于耳朵的卫生与健康。对于运动爱好者和耳机发烧友而…

热题系列章节1

22. 括号生成 数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且 有效的 括号组合。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[“((()))”,“(()())”,“(())()”,“()(())”,“()()()”] 示例 2&#xff1a…

Ubuntu(22.04)不能上网解决办法

想必大家可能在别的贴子看到用以下指令的方法&#xff0c;但是在22版本的ubuntu是行不通的&#xff0c;问题在于22版本中网络管理器的名字压根不是network-manager&#xff0c;而是 NetworkManager. sudo service network-manager stop sudo rm /var/lib/NetworkManager/Netw…

力扣hot100学习记录(八)

206. 反转链表 给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 题意 给一个链表&#xff0c;将链表进行翻转 思路 用两个指针维护相邻两个点&#xff0c;每次把后面一个点指向前一个点&#xff0c;直到后一个点指向空&#xff0c;最后把…

ESP32-C3模组上跑通OTA升级(8)

接前一篇文章&#xff1a;ESP32-C3模组上跑通OTA升级&#xff08;7&#xff09; 本文内容参考&#xff1a; 杂项系统 API - ESP32 - — ESP-IDF 编程指南 latest 文档 《ESP32-C3 物联网工程开发实战》 乐鑫科技 特此致谢&#xff01; 七、固件版本 将不同功能的固件标记为…

阿里云Linux 3.2104 LTS 64位安装SVN服务器

直接按步骤 yum install subversion 写y就行 主要是看看安装了那些文件 rpm -ql subversion 主要是为了创建版本库而准备&#xff0c;这个能一遍创建就一遍创建&#xff0c;不行就逐个创建。能创就忽略下面两个mkdir步骤。 mkdir /home/svn/groupRepos 根据新建目录作为版本…

嵌入式作业5

在函数main.c中初始化三种颜色的灯&#xff1a; gpio_init(LIGHT_BLUE, GPIO_OUTPUT, LIGHT_OFF); //蓝灯 gpio_init(LIGHT_GREEN, GPIO_OUTPUT, LIGHT_OFF); //绿灯 gpio_init(LIGHT_RED, GPIO_OUTPUT, LIGHT_OFF); //红灯 同时为了响应以上修改&#xff0c;进入isr。c…

1098: 堆的判断

解法&#xff1a; 堆是完全二叉树 用数组来存储 然后用定义判定 #include<iostream> #include<vector> using namespace std; int main() {int n;cin >> n;vector<int> vec(n);for (int i 0; i < n; i) cin >> vec[i];for (int i 0; i &…

【第1章】SpringBoot入门

文章目录 前言一、版本要求1. SpringBoot版本2. 其他2.1 System Requirements2.2 Servlet Containers2.3 GraalVM Native Images 3. 版本定型 二、新建工程1.IDEA创建 ( 推荐 ) \color{#00FF00}{(推荐)} (推荐)2. 官方创建 三、第一个SpringBoot程序1. 引入web2. 启动类3. 启动…

【Unitydemo制作】音游制作—模式玩法的实现

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;就业…

亚马逊开店详细教程(6)- 获得商品的评分

1. 为什么要参加 VINE计划 用户在浏览一个新上架的商品时&#xff0c;通常会参照以往买家的对商品的评论&#xff0c;如果你是新全的商品可能没有任何评论信息&#xff0c;这可以会让一部分用户对购买产品有所顾虑&#xff0c;参加亚马逊Vine计划能够帮助新产品快速获得高质量…