【Node.js从基础到高级运用】二十五、Node.js中Cluster的作用

这篇具有很好参考价值的文章主要介绍了【Node.js从基础到高级运用】二十五、Node.js中Cluster的作用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

引言

Node.js中的cluster模块允许您轻松创建共享服务器端口的子进程。这是一个核心模块,用于在Node.js应用程序中实现多进程架构,以充分利用多核CPU系统的计算能力。

cluster介绍

当您启动一个Node.js应用程序时,默认情况下它运行在单个进程中。对于多核CPU系统来说,这意味着您可能没有充分利用系统的全部潜力。通过使用cluster模块,您可以启动一个主进程(通常称为“master”或“主”进程),它可以分叉多个工作进程(“workers”或“工作进程”),每个工作进程都是应用程序的一个实例,运行在自己的进程中。

主进程不负责处理实际的工作负载,而是负责监控和管理工作进程。例如,它可以根据需要创建新的工作进程或替换已经崩溃的工作进程。这样,即使某个工作进程崩溃,整个应用程序也可以继续运行。

cluster模块的基本使用步骤如下:

  1. 引入cluster模块。
  2. 使用cluster.isMaster属性检查当前进程是否是主进程。
  3. 在主进程中,使用cluster.fork()方法创建工作进程。
  4. 设置必要的事件监听,以便于主进程可以响应工作进程的启动、退出等事件。
  5. 在工作进程中,编写实际处理客户端请求的代码。

使用cluster模块的好处包括:

  • 提高性能:通过在多个核心上并行运行,可以更有效地利用服务器的硬件资源。
  • 提高可靠性:如果一个工作进程崩溃,它可以被新的工作进程替换,而不会影响其他工作进程或主进程。
  • 负载分配:Node.js的cluster模块可以在工作进程之间自动分配连接,以实现负载均衡。

基础使用

使用 cluster 模块来创建一个能够处理多核 CPU 的服务器。

// 导入http和cluster模块
const http = require('http');
const cluster = require('cluster');
const numCPUs = require('os').cpus().length; // 获取CPU的核心数

if (cluster.isMaster) {
    console.log(`主进程 ${process.pid} 正在运行`);

    // 衍生工作进程。
    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) => {
        res.writeHead(200);
        res.end('Hello World!');
    }).listen(3000);

    console.log(`工作进程 ${process.pid} 已启动`);
}

代码解释:

  1. 引入模块: 引入 http, cluster, 和 os 模块。
  2. 主进程与工作进程逻辑: 使用 cluster.isMaster 来区分代码执行是在主进程还是工作进程中。
  3. 主进程逻辑:
    • 主进程负责打印当前进程的 PID,并根据 CPU 核心数衍生相应数量的工作进程。
    • 监听 exit 事件以打印退出的工作进程信息。
  4. 工作进程逻辑:
    • 每个工作进程都设置了一个 HTTP 服务器监听同一个端口(3000端口)。
    • 工作进程的启动会被记录在日志中。

使用这种方法,Node.js 应用可以有效地利用多核 CPU,提高应用的处理能力和响应速度。

进阶使用:零停机重启

const http = require("http");
const cluster = require("cluster");
const os = require("os");
  //cpu数量(几核)
const cpus = os.cpus().length;
// console.log(`Clustering to ${cpus} CPUS`);
var express = require("express")();
//主进程
if (cluster.isMaster) {
  console.log("master process id :", process.pid);

  for (let i = 0; i < cpus; i++) {
    //分派子进程
    cluster.fork();
  }

  //服务器收到这个消息,退出任务
  process.on("SIGINT", function () {
    console.log("ctrl+c");
    process.exit();
  });


  express.listen(9000);

  // 当主进程收到指定消息时(访问restart),开始“零停机重启”操作。
  express.get("/restart", function (req, res, next) {
    const workers = Object.keys(cluster.workers);
    // console.log('workers',workers)
    //重启函数
    function restart_worker(i) {
      if (i >= workers.length) return;

      //第i个工作进程
      var worker = cluster.workers[workers[i]];
      console.log(`Stoping worker:${worker.process.pid}`);

      //中断工作进程
      worker.disconnect();

      //工作进程退出时
      worker.on("exit", function () {

        //启动工作进程
        const new_worker = cluster.fork();

        //当新的工作进程,准备好,并开始监听新的连接时,迭代重启下一个工作子进程
        new_worker.on("listening", function () {
          restart_worker(i + 1);
        })
      });
    }

    //重启第一个工作进程
    restart_worker(0);

    res.end("restart ok");

  });

} else {
  //子进程执行内容

  const pid = process.pid;

  http.createServer(function (req, res) {
    console.log(`Handing request from ${pid}`);
    res.end(`Hello from ${pid}\n`);
  }).listen(8000, function () {
    console.log(`Started ${pid}`);
  })

}

代码解析:

集群主进程用express提供web服务;

集群子工作进程用http提供web服务;
当主进程收到指定消息时(访问restart路径),开始“零停机重启”操作。

实现重点是:停掉一个工作进程,并重启一个新的工作进程,当新的工作进程启动好,并进入监听状态时(即:可正常提供Web服务时),再重启下一个工作进程,直到全部重启完成。

执行效果:

【Node.js从基础到高级运用】二十五、Node.js中Cluster的作用,Node.js,node.js
为了更直观展示效果加入一行代码:

http.createServer(function (req, res) {
    console.log(`Handing request from ${pid}`);
    res.end(`Hello from ${pid}\n`);
  }).listen(8000, function () {
    console.log(`Started ${pid}`);
    
    console.log(`${pid} hello 7777777777777777777777`)
  })

此时先启动服务:

node test25

再次修改代码:

http.createServer(function (req, res) {
    console.log(`Handing request from ${pid}`);
    res.end(`Hello from ${pid}\n`);
  }).listen(8000, function () {
    console.log(`Started ${pid}`);
    
    console.log(`${pid} hello 8888888888888888888888`)
  })

通过网页打开http://localhost:9000/restart触发重启:
【Node.js从基础到高级运用】二十五、Node.js中Cluster的作用,Node.js,node.js
结果:
【Node.js从基础到高级运用】二十五、Node.js中Cluster的作用,Node.js,node.js

总结

需要注意的是,cluster模块并不是万能的。例如,在有状态的应用程序中,您可能需要考虑如何在工作进程之间共享状态。此外,如果您的应用程序主要受到I/O限制而不是CPU限制,那么增加更多的工作进程可能不会带来太大的性能提升。

参考

Nodejs教程63:零停机重启文章来源地址https://www.toymoban.com/news/detail-855350.html

到了这里,关于【Node.js从基础到高级运用】二十五、Node.js中Cluster的作用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Three.js - 通过键盘控制模型移动和攻击(二十五)

    上节加载了模型和模型动画,本节使用键盘控制模型移动和连贯动画实现攻击动作。 基础模板 上节讲述加载了模型,并实现了动画。本节在上节的基础上进行修改。 修改灯光并添加阴影 开启阴影渲染。 添加方向光,开启阴影投射。 在地面网格上开启阴影接收。 修改模型网

    2024年02月10日
    浏览(42)
  • Java基础二十五(Map)

    Map 接口是 Java 集合框架中的一种用于储存键值对映射关系的接口。 Map 接口提供了一种通过键来访问值的方式,其中每一个键都是唯一的,值可以重复。 Map 接口的主要特征如下: 键唯一性: Map 中的键是唯一的,同一个键只能对应一个值。如果重复插入相同的键,则后面的

    2024年02月09日
    浏览(26)
  • 【JavaSE】Java基础语法(二十五):异常

    异常的概述 异常就是程序出现了不正常的情况 异常的体系结构 编译时异常 都是Exception类及其子类 必须显示处理,否则程序就会发生错误,无法通过编译 运行时异常 都是RuntimeException类及其子类 无需显示处理,也可以和编译时异常一样处理 图示 如果程序出现了问题,我们

    2024年02月06日
    浏览(35)
  • web学习笔记(四十五)Node.js

    目录 1. Node.js 1.1 什么是Node.js 1.2 为什么要学node.js 1.3  node.js的使用场景 1.4 Node.js 环境的安装 1.5 如何查看自己安装的node.js的版本 1.6 常用终端命令 2. fs 文件系统模块 2.1引入fs核心模块 2.2 读取指定文件的内容 2.3  向文件写入指定内容 2.4 创建文件夹  2.5 判断文件夹是否存

    2024年04月16日
    浏览(24)
  • 【随笔】Git 基础篇 -- 远程仓库 git clone(二十五)

    💌 所属专栏:【Git】 😀 作  者:我是夜阑的狗🐶 🚀 个人简介:一个正在努力学技术的CV工程师,专注基础和实战分享 ,欢迎咨询! 💖 欢迎大家:这里是CSDN,我总结知识的地方,喜欢的话请三连,有问题请私信 😘 😘 😘 您的点赞、关注、收藏、评论,是对我最大

    2024年04月15日
    浏览(39)
  • JS高级 -- 作用域&解构&箭头函数

    作用域(scope)规定了变量能够被访问的“范围”离开了这个“范围”变量便不能被访问 作用域分为:局部作用域、全局作用域 1.1 局部作用域 局部作用域分为函数作用域和块作用域。 函数作用域: 在函数内部声明的变量只能在函数内部被访问,外部无法直接访问。 总结: 函数

    2023年04月27日
    浏览(28)
  • 什么是EventEmitter?它在Node.js中有什么作用?

    前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而又亲切的学习平台。在这个

    2024年02月07日
    浏览(32)
  • 什么是Node.js的流(stream)?它们有什么作用?

    聚沙成塔·每天进步一点点 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而

    2024年02月06日
    浏览(28)
  • Node.js的基本概念&&node -v 和npm -v 这两个命令的作用

    Node.js 是一个开源且跨平台的 JavaScript 运行时环境,它可以让你在服务器端运行 JavaScript 代码。Node.js 使用了 Chrome 的 V8 JavaScript 引擎来执行代码,非常高效。 在 Node.js 出现之前,JavaScript 通常只在浏览器中运行,用于控制网页行为和与用户交互。Node.js 的出现让 JavaScript 能够

    2024年02月08日
    浏览(41)
  • 在Node.js中,什么是中间件(middleware)?它们的作用是什么?

    聚沙成塔·每天进步一点点 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一个系统而

    2024年02月06日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包