Node.js以其速度和效率而闻名,使其成为构建高性能、可扩展应用程序的流行选择。
然而,Node.js 是开箱即用的,这意味着它在单个 CPU 核心上运行,这在多核服务器环境中可能会受到限制。如果您的应用程序是资源密集型的或者您期望高流量,您将希望最大限度地利用服务器的 CPU 内核。
这就是 Node.js 集群的用武之地。
在这篇文章中,我们将深入探讨Node.js 集群是什么、为什么它很重要,以及如何使用它来提高应用程序的性能。
Node.js 集群是一种允许您通过生成 Node.js 应用程序的多个实例(工作进程)来利用所有 CPU 核心的技术。
这些工作进程共享相同的端口并由主进程管理。每个工作人员都可以独立处理传入请求,从而允许您的应用程序并行分配工作负载和处理请求。
通过集群 Node.js 应用程序,您可以:
在 Node.js 集群中,有一个 master 进程,控制多个 worker 进程。
主进程不直接处理 HTTP 请求,而是管理处理 HTTP 请求的工作进程。来自客户端的请求分布在这些工作人员之间,有效地平衡负载。
如果工作进程由于某种原因崩溃,主进程可以生成一个新进程,以确保最短的停机时间。
当您的应用程序满足以下条件时,集群特别有用:
在上述情况下,您可以使用异步编程技术来提高吞吐量。
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 步:测试您的集群应用程序
现在,如果您运行该应用程序:
node server.js
每个请求由不同的worker处理,有效平衡负载。
您可以通过发送多个请求并观察工作负载如何在工作人员之间分配来测试集群如何提高应用程序的性能。所以,下次构建高性能 Node.js 应用程序时,请记住考虑集群!
这就是本博客的全部内容!请继续关注更多更新并继续构建令人惊叹的应用程序! ?✨
快乐编码! ?
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3