”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 集群您的 Node.js 应用程序以获得更好的性能

集群您的 Node.js 应用程序以获得更好的性能

发布于2024-11-08
浏览:726

Node.js以其速度效率而闻名,使其成为构建高性能、可扩展应用程序的流行选择。
然而,Node.js 是开箱即用的,这意味着它在单个 CPU 核心上运行,这在多核服务器环境中可能会受到限制。如果您的应用程序是资源密集型的或者您期望高流量,您将希望最大限度地利用服务器的 CPU 内核。
这就是 Node.js 集群的用武之地。

在这篇文章中,我们将深入探讨Node.js 集群是什么、为什么它很重要,以及如何使用它来提高应用程序的性能

什么是 Node.js 集群?

Node.js 集群是一种允许您通过生成 Node.js 应用程序的多个实例(工作进程)来利用所有 CPU 核心的技术。
这些工作进程共享相同的端口并由主进程管理。每个工作人员都可以独立处理传入请求,从而允许您的应用程序并行分配工作负载和处理请求。

通过集群 Node.js 应用程序,您可以:

  • 利用多个CPU核心
  • 提高应用程序性能
  • 在一名工作人员崩溃的情况下提供容错能力
  • 水平扩展而不会使代码库过于复杂

集群如何工作?

在 Node.js 集群中,有一个 master 进程,控制多个 worker 进程。
主进程不直接处理 HTTP 请求,而是管理处理 HTTP 请求的工作进程。来自客户端的请求分布在这些工作人员之间,有效地平衡负载。

如果工作进程由于某种原因崩溃,主进程可以生成一个新进程,以确保最短的停机时间。

什么时候应该使用集群?

当您的应用程序满足以下条件时,集群特别有用:

  • 流量高,需要处理大量并发请求
  • 执行 CPU 密集型任务,例如视频编码、图像处理或大规模数据解析。
  • 在未充分利用的多核处理器上运行 如果您的应用程序花费大量时间等待 I/O 操作,例如数据库查询或 API 调用,集群可能不会显着提高性能。

在上述情况下,您可以使用异步编程技术来提高吞吐量

如何在 Node.js 中实现集群

Node.js提供了内置的集群模块来轻松创建集群。让我们通过一个简单的示例来了解如何集群 Node.js 应用程序。

第 1 步:设置您的应用程序
在添加集群之前,我们假设您有一个简单的 HTTP 服务器(server.js):

const http = require('http');

const server = http.createServer((req, res) => {
  res.writeHead(200);
  res.end('Hello World\n');
});

server.listen(3000, () => {
  console.log(`Worker process ID: ${process.pid} is listening on port 3000`);
});

该应用程序在单核上运行。让我们修改它以使用聚类。

第2步:使用集群模块
集群模块允许我们将当前进程分叉为多个工作进程。下面是如何实现聚类:

const cluster = require('cluster');
const http = require('http');
const os = require('os');

// Get the number of CPU cores
const numCPUs = os.cpus().length;

if (cluster.isMaster) {
  console.log(`Master process ID: ${process.pid}`);

  // Fork workers for each CPU core
  for (let i = 0; i  {
    console.log(`Worker ${worker.process.pid} died. Spawning a new one...`);
    cluster.fork();
  });
} else {
  // Workers share the same TCP connection
  http.createServer((req, res) => {
    res.writeHead(200);
    res.end('Hello from worker '   process.pid   '\n');
  }).listen(3000);

  console.log(`Worker process ID: ${process.pid}`);
}

解释:
1.主进程:[​​&&&]当进程启动时,它会检查它是否是主进程(cluster.isMaster)。主站负责分叉工作进程,每个CPU核心一个。 os.cpus() 方法用于检索可用的 CPU 核心数。

2.工作进程: 对于每个 CPU 核心,都会派生一个新工作进程 (cluster.fork())。这些工作进程运行 HTTP 服务器并处理传入请求。

3.容错性: 如果一个工作进程崩溃了, cluster.on('exit') 事件被触发,并且会产生一个新的工作进程来替换死掉的进程。

第 3 步:测试您的集群应用程序 现在,如果您运行该应用程序:

节点服务器.js
node server.js

Cluster Your Node.js Application for Better Performance

您会注意到创建了多个工作进程,每个进程都有一个唯一的进程 ID。

每个请求由不同的worker处理,有效平衡负载。

您可以通过发送多个请求并观察工作负载如何在工作人员之间分配来测试集群如何提高应用程序的性能。

所以,下次构建高性能 Node.js 应用程序时,请记住考虑集群!

这就是本博客的全部内容!请继续关注更多更新并继续构建令人惊叹的应用程序! ?✨

快乐编码! ?

版本声明 本文转载于:https://dev.to/jagroop2001/cluster-your-nodejs-application-for-better-performance-2ckn?1如有侵犯,请联系[email protected]删除
最新教程 更多>
  • CSS强类型语言解析
    CSS强类型语言解析
    您可以通过其强度或弱输入的方式对编程语言进行分类的方式之一。在这里,“键入”意味着是否在编译时已知变量。一个例子是一个场景,将整数(1)添加到包含整数(“ 1”)的字符串: result = 1 "1";包含整数的字符串可能是由带有许多运动部件的复杂逻辑套件无意间生成的。它也可以是故意从单个真理...
    编程 发布于2025-05-02
  • 如何使用“ JSON”软件包解析JSON阵列?
    如何使用“ JSON”软件包解析JSON阵列?
    parsing JSON与JSON软件包 QUALDALS:考虑以下go代码:字符串 } func main(){ datajson:=`[“ 1”,“ 2”,“ 3”]`` arr:= jsontype {} 摘要:= = json.unmarshal([] byte(...
    编程 发布于2025-05-02
  • 查找当前执行JavaScript的脚本元素方法
    查找当前执行JavaScript的脚本元素方法
    如何引用当前执行脚本的脚本元素在某些方案中理解问题在某些方案中,开发人员可能需要将其他脚本动态加载其他脚本。但是,如果Head Element尚未完全渲染,则使用document.getElementsbytagname('head')[0] .appendChild(v)的常规方...
    编程 发布于2025-05-02
  • 如何使用Depimal.parse()中的指数表示法中的数字?
    如何使用Depimal.parse()中的指数表示法中的数字?
    在尝试使用Decimal.parse(“ 1.2345e-02”中的指数符号表示法时,您可能会出现错误。这是因为默认解析方法无法识别指数符号。 成功解析这样的字符串,您需要明确指定它代表浮点数。您可以使用numbersTyles.Float样式进行此操作,如下所示:[&& && && &&华氏度D...
    编程 发布于2025-05-02
  • 为什么PYTZ最初显示出意外的时区偏移?
    为什么PYTZ最初显示出意外的时区偏移?
    与pytz 最初从pytz获得特定的偏移。例如,亚洲/hong_kong最初显示一个七个小时37分钟的偏移: 差异源利用本地化将时区分配给日期,使用了适当的时区名称和偏移量。但是,直接使用DateTime构造器分配时区不允许进行正确的调整。 example pytz.timezone(...
    编程 发布于2025-05-02
  • 切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    切换到MySQLi后CodeIgniter连接MySQL数据库失败原因
    Unable to Connect to MySQL Database: Troubleshooting Error MessageWhen attempting to switch from the MySQL driver to the MySQLi driver in CodeIgniter,...
    编程 发布于2025-05-02
  • C++20 Consteval函数中模板参数能否依赖于函数参数?
    C++20 Consteval函数中模板参数能否依赖于函数参数?
    [ consteval函数和模板参数依赖于函数参数在C 17中,模板参数不能依赖一个函数参数,因为编译器仍然需要对非contexexpr futcoriations contim at contexpr function进行评估。 compile time。 C 20引入恒定函数,必须在编译时进行...
    编程 发布于2025-05-02
  • 如何克服PHP的功能重新定义限制?
    如何克服PHP的功能重新定义限制?
    克服PHP的函数重新定义限制在PHP中,多次定义一个相同名称的函数是一个no-no。尝试这样做,如提供的代码段所示,将导致可怕的“不能重新列出”错误。 但是,PHP工具腰带中有一个隐藏的宝石:runkit扩展。它使您能够灵活地重新定义函数。 runkit_function_renction_re...
    编程 发布于2025-05-02
  • 在JavaScript中如何并发运行异步操作并正确处理错误?
    在JavaScript中如何并发运行异步操作并正确处理错误?
    同意操作execution 在执行asynchronous操作时,相关的代码段落会遇到一个问题,当执行asynchronous操作:此实现在启动下一个操作之前依次等待每个操作的完成。要启用并发执行,需要进行修改的方法。 第一个解决方案试图通过获得每个操作的承诺来解决此问题,然后单独等待它们: co...
    编程 发布于2025-05-02
  • 如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    如何将MySQL数据库添加到Visual Studio 2012中的数据源对话框中?
    在Visual Studio 2012 尽管已安装了MySQL Connector v.6.5.4,但无法将MySQL数据库添加到实体框架的“ DataSource对话框”中。为了解决这一问题,至关重要的是要了解MySQL连接器v.6.5.5及以后的6.6.x版本将提供MySQL的官方Visual...
    编程 发布于2025-05-02
  • 如何为单个HTML元素应用多个CSS类?
    如何为单个HTML元素应用多个CSS类?
    将多个CSS类应用于html中的单个元素,类属性可以用于类型的CSS类,以指定元素来定型。但是,如果您在同一类属性中分配多个类,则面对仅应用一个类的问题。问题:Answer:There are two methods to apply multiple CSS classes to a singl...
    编程 发布于2025-05-02
  • 如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    如何从Python中的字符串中删除表情符号:固定常见错误的初学者指南?
    从python import codecs import codecs import codecs 导入 text = codecs.decode('这狗\ u0001f602'.encode('utf-8'),'utf-8') 印刷(文字)#带有...
    编程 发布于2025-05-02
  • 人脸检测失败原因及解决方案:Error -215
    人脸检测失败原因及解决方案:Error -215
    错误处理:解决“ error:( - 215)!empty()in Function openCv in Function MultSiscale中的“检测”中的错误:在功能检测中。”当Face Cascade分类器(即面部检测至关重要的组件)未正确加载时,通常会出现此错误。要解决此问题,必须...
    编程 发布于2025-05-02
  • JavaScript中如何动态访问全局变量?
    JavaScript中如何动态访问全局变量?
    在JavaScript 一种方法是使用窗口对象存储和检索变量。通过引用全局范围,可以使用其名称动态访问变量。 //一个脚本 var somevarname_10 = 20; //另一个脚本 window.all_vars = {}; window.all_vars ['somevarnam...
    编程 发布于2025-05-02
  • Java数组中元素位置查找技巧
    Java数组中元素位置查找技巧
    在Java数组中检索元素的位置 利用Java的反射API将数组转换为列表中,允许您使用indexof方法。 (primitives)(链接到Mishax的解决方案) 用于排序阵列的数组此方法此方法返回元素的索引,如果发现了元素的索引,或一个负值,指示应放置元素的插入点。
    编程 发布于2025-05-02

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3