NodeJS 集群模块: 为App创建集群实例

news2024/9/9 0:26:15

NodeJS 集群模块: 为App创建集群实例

目录

  • NodeJS 集群模块: 为App创建集群实例
      • Node.js 集群介绍:终极扩展策略
      • 使用集群模块开始扩展 Node.js
      • 扩展 Node.js 的两种集群策略
      • 使用集群受益的 Node.js 应用程序示例
      • 没有集群的 Node.js:不可伸缩的原则
      • 集群操作:一个扩展的 Node.js 应用程序
      • 对两个示例进行负载测试:哪个扩展效果更好?
      • 集群化限制:何时不应使用集群扩展Node.js
      • 结论

推荐超级课程:

  • Docker快速入门到精通
  • Kubernetes入门到大师通关课
  • AWS云服务快速入门实战

本文介绍了在 Node.js 中进行集群处理以及如何使您的应用程序受益于扩展。您将使用集群模块 以创建集群实例。您将学到:

  • 为什么需要集群作为扩展 Node.js 应用程序的策略。
  • 如何使用原生和 PM2 模块使用 express 创建和扩展 Node.js 集群。
  • 集群和非集群 Node.js 应用程序之间的扩展比较。
  • 对 Node.js 集群进行负载测试作为性能监控方法。
  • 如果 Node.js 集群不符合您的应用设计,需要了解的事项。

在这里插入图片描述

Node.js 集群介绍:终极扩展策略

Node.js 默认情况下是单线程的运行时。这意味着运行中的 Node.js 仅利用计算机的一个核心(CPU 单元),即使任何一台计算机都有多个处理器。例如,如果您在一台有 4 个处理器的计算机上运行 Node.js 应用程序,则只使用其中一个。然而,Node.js 允许您使用集群,充分利用多核处理器,并将您的 Node.js 应用程序扩展到新的水平。

使用集群模块开始扩展 Node.js

以拥有四个处理器的计算机为例。Node.js 只会利用其处理能力的 25%。Node.js 运行一个 worker Node 来执行所有你的 Node.js 函数。这种策略在您的应用程序中运行了密集任务时会受到影响。worker Node 将在重任务进行中被阻塞。

Node.js 集群的概念是创建多个您的 Node.js 应用程序实例(worker)。这将为同一应用程序创建一个跨可用 CPU 核心分布负载的集群。在这种情况下,当您的重任务正在处理时,您的集群模块将将任何连续的任务生成到剩余的处理器中。简而言之,集群将增强应用程序的性能和可扩展性。

让我们深入学习如何添加 Node.js worker 集群并利用计算机的全部处理能力。

扩展 Node.js 的两种集群策略

如果您希望在 Node.js 中使用集群,有两种方式可以实现这一点:

  • 使用原生 Cluster模块。
  • 使用进程管理器,例如PM2。
  1. 原生 Cluster

Node.js 自带一个内置的集群模块。它允许您手动将 worker 分叉到可用处理器上。这样,Node.js 将跨多个子进程分配传入请求以增强可伸缩性。

  1. 使用 PM2 进行集群处理

PM2 是一个生产级流程管理器。像原生集群模块一样,PM2 具有内置的集群支持。但是,它固有地还伴随其他与生产相关的元素,例如:

  • 零停机部署。
  • 应用程序监控。
  • 日志和指标管理。
  • 自动应用程序重启。

使用集群受益的 Node.js 应用程序示例

现在您了解了 Node.js 集群以及您可以使用的方法,让我们演示如何集群对于可伸缩性是如何有利的。您将创建两个简单示例,一个不使用集群,另一个使用集群,并使用想象的用户来模拟和扩展测试以比较性能。

没有集群的 Node.js:不可伸缩的原则

由于 Node.js 是单线程的,它必须在处理应用程序内的其他任务之前完成一个任务的执行。这个概念关乎 Node.js 单线程方面,它只使用一台计算机处理器。

要演示这个工作原理,您可以使用Express创建一个简单的 Node.js 应用程序,如下所示:

const express = require("express");
const PORT = 3000;
const app = express();

// 模拟一个耗时任务
app.get("/compute", (req, res) => {
   
  const startTime = Date.now();
  // 模拟一个 10 秒的计算
  const duration = 10000;
  while (Date.now() - startTime < duration) {
   }
  res.send("计算完成!");
});

// 提供一个简单的 HTTP 请求
app.get("/hello", (req, res) => {
   
  res.send("来自 worker 进程的问候!");
});

app.listen(PORT, () => {
   
  console.log(`应用程序正在端口 ${
     PORT} 上监听`);
});

上面的示例创建了两个 GET 请求:

  • 一个简单的 GET 请求,发送一个基本请求
  • 一个模拟的 GET 请求,执行 10 秒来返回用户请求

假设的模拟 10 秒任务现在代表任何您可以执行的耗时任务。根据 Node.js 的工作方式,如果发送一个请求来执行 localhost:3000/compute,Node.js 将锁定到单个处理器上,并且无法执行其他任务。

NodeJS 集群指南-手头上的 NodeJS 解决方案

这个任务需要 10 秒,并锁定您的计算资源,直到其计算完成:

NodeJS 集群指南-手头上的 NodeJS 解决方案

这意味着如果您在 localhost:3000/compute 正在运行时执行 localhost:3000/hellolocalhost:3000/hello 将无法返回其响应,即使它只是一个简单的 GET 请求ÿ

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

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

相关文章

Redis的分片机制

Redis的分片机制 Redis是一个开源的内存数据结构存储系统&#xff0c;它支持键值对的存储方式。Redis的分片机制允许将数据在多个节点上进行分布式存储和处理&#xff0c;从而提高系统的性能和可扩展性。 Redis的分片机制是通过一致性哈希算法实现的。一致性哈希算法将所有的ke…

vue2 脚手架

安装 文档&#xff1a;https://cli.vuejs.org/zh/ 第一步&#xff1a;全局安装&#xff08;仅第一次执行&#xff09; npm install -g vue/cli 或 yarn global add vue/cli 备注&#xff1a;如果出现下载缓慢&#xff1a;请配置npm 淘宝镜像&#xff1a; npm config set regis…

EFcore的实体类配置

1 约定配置 约定大于配置&#xff0c;框架默认了许多实体类配置的规则&#xff0c;在约定规则不满足要求时&#xff0c;可以显示地定义规则 1 数据库表明在不指定的情况下&#xff0c;默认使用的是数据库上下文类【DBContext】中DbSet 的属性名&#xff1b; 2 数据库表列的名字…

大数据开发--02.环境准备

一.准备三台linux虚拟机 1.分别取名node1,node2,node3 2.配置静态ip 这里以node1为例&#xff0c;配置静态ip地址&#xff0c;其他node2.node3一样 配置完成之后别忘记 systemctl restart network 3.在各自的/etc/hosts文件中编辑三个Ip地址 三台都要配置&#xff0c; 4.然…

使用Dockerfile打包java项目生成镜像部署到Linux

1、Dockerfile 介绍 如果说容器就是“小板房”&#xff0c;镜像就是“样板间”。那么&#xff0c;要造出这个“样板间”&#xff0c;就必然要有一个“施工图纸”&#xff0c;由它来规定如何建造地基、铺设水电、开窗搭门等动作。这个“施工图纸”就是“Dockerfile”。 比起容…

【MySql实战--日志系统:一条SQL更新语句是如何执行的?】

前面我们系统了解了一个查询语句的执行流程&#xff0c;并介绍了执行过程中涉及的处理模块。相信你还记得&#xff0c;一条查询语句的执行过程一般是经过连接器、分析器、优化器、执行器等功能模块&#xff0c;最后到达存储引擎。 那么&#xff0c;一条更新语句的执行流程又是怎…

Apache Superset

前言 最近在准备一个小的项目&#xff0c;需要对 Hive 的数据进行展示&#xff0c;所以想到了把 Hive 的数据导出到 MySQL 然后用 Superset 进行展示。 Superset 1.1 Superset概述 Apache Superset是一个现代的数据探索和可视化平台。它功能强大且十分易用&#xff0c;可对接…

基于WTR096-28SS芯片方案的宠物喂食器实现智能化喂食功能

一、简介 本方案宠物喂食器采用了WTR096-28SS芯片方案来实现智能化的喂食功能。该方案结合了先进的技术和设计理念&#xff0c;提供了便捷、智能和个性化的宠物喂食解决方案。 该宠物喂食器具备定时、定量喂食功能&#xff0c;可以根据主人设定的时间和食物量&#xff0c;自动…

AI大模型与ChatGPT:开启智慧科研新篇章丨ChatGPT在地学、GIS、气象、农业、生态、环境科学等领域应用

目录 专题一 开启大模型 专题二 基于ChatGPT大模型提问框架 专题三 基于ChatGPT大模型的论文助手 专题四 基于ChatGPT大模型的数据清洗 专题五 基于ChatGPT大模型的统计分析 专题六 基于ChatGPT的经典统计模型 专题七 基于ChatGPT大模型的机器学习 专题八 ChatGPT的二次…

stm32f103c8t6学习笔记(学习B站up江科大自化协)-ADC

ADC简介 ADC&#xff0c;英文全称是Analog to Digital Convert&#xff0c;意为模拟数字转换器&#xff0c;简称模数转换器&#xff0c;或者叫AD转换器&#xff0c;STM32主要是数字电路&#xff0c;数字电路只有高低电平&#xff0c;没有几V电压的概念&#xff0c;如果想读取电…

AI大模型额外学习一:斯坦福AI西部世界小镇笔记(包括部署和源码分析)

文章目录 一、简单介绍1&#xff09;项目代码介绍2&#xff09;重新播放模拟3&#xff09;适当修改分叉模拟 二、部署斯坦福小镇Demo1&#xff09;准备工作2&#xff09;解决遇到的bug3&#xff09;启动服务器和前端 三、源码剖析1&#xff09;主题顺序 github链接 一、简单介…

排序算法:快速排序(非递归)

文章目录 一、先建立一个栈二、代码编写 !](https://img-blog.csdnimg.cn/direct/870dd101173d4522862e4459b32237a3.png) 先赞后看&#xff0c;养成习惯&#xff01;&#xff01;&#xff01;^ _ ^<3 ❤️ ❤️ ❤️ 码字不易&#xff0c;大家的支持就是我坚持下去的动力…

鸿蒙开发之导航栏tabs(类似Android tablayout)

当页面信息较多时&#xff0c;为了让用户能够聚焦于当前显示的内容&#xff0c;需要对页面内容进行分类&#xff0c;提高页面空间利用率。Tabs组件可以在一个页面内快速实现视图内容的切换&#xff0c;一方面提升查找信息的效率&#xff0c;另一方面精简用户单次获取到的信息量…

ES的集群节点发现故障排除指南(1)

本文是ES官方文档关于集群节点发现与互联互通的问题排查指南内容。 英文原文&#xff08;官网&#xff09; 集群节点发现是首要任务 集群互连&#xff0c;重中之重&#xff01; 在大多数情况下&#xff0c;发现和选举过程会迅速完成&#xff0c;并且主节点会长时间保持当选状…

3个Tips,用“AI”开启新生活

相信最近&#xff0c;很多朋友们都回归到了忙碌的生活节奏中。生活模式的切换&#xff0c;或多或少会带来身体或情绪状况的起伏。新技术正在为人们生活的方方面面带来便利。3个小Tips或许能让你也从新技术中获益&#xff0c;从身到心&#xff0c;用“AI”开启新生活。 关”A…

【研究僧总结】回顾第1095个创作日

目录 前言一. 机缘二. 日常三. 展望 前言 感觉刚过1024不久&#xff0c;现在又来个1095创作日 一. 机缘 研究僧一直在找平台做笔记&#xff0c;方便之后的回顾总结&#xff0c;也让各位网友见证你我的成长&#xff0c;相互学习 止不住的写文止不住的成长&#xff0c;大家共同…

流畅的 Python 第二版(GPT 重译)(十二)

第五部分&#xff1a;元编程 第二十二章&#xff1a;动态属性和属性 属性的关键重要性在于&#xff0c;它们的存在使得将公共数据属性作为类的公共接口的一部分完全安全且确实可取。 Martelli、Ravenscroft 和 Holden&#xff0c;“为什么属性很重要” 在 Python 中&#xff0…

腾讯云优惠券怎么领?谁知道?分享一下

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

Mysql——基础命令集合

目录 前期准备 先登录数据库 一、管理数据库 1.数据表结构解析 2.常用数据类型 3.适用所有类型的修饰符 4.使用数值型的修饰符 二、SQL语句 1.SQL语言分类 三、Mysql——Create,Show,Describe,Drop 1.创建数据库 2.查看数据库 3.切换数据库 4.创建数据表 5.查看…

Linux信号补充——信号发送和保存

三、信号的发送与保存 3.1信号的发送 ​ 必须有操作系统来保存信号&#xff0c;因为他是管理者&#xff1b; ​ 信号给进程的task_struct发送信号&#xff0c;在task_struct中维护了一个整数signal有0-31位&#xff0c;共32个bit位&#xff1b;对于信号的管理使用的是位图结…