使用 Cluster Module 扩展 Node JS 应用

2025-06-10

使用 Cluster Module 扩展 Node JS 应用

📍 NodeJS 并发

🙂 说到编写后​​端(或者说 API),我们用 NodeJS 写代码非常快。但你知道 NodeJS 是单线程的吗?🥲。没错,单线程技术确实会降低我们应用程序的效率。

NodeJS 并发

😌 但是我们可以在 NodeJS(或者一般的 JS)中使用异步编程,这可以简化并发编程。有一种叫做事件循环和回调队列的东西。

NodeJS 回调队列

😊 就像这里一样,setTimeout() 是一个异步函数,它不会暂停后续代码行的执行(它们是同步的),并且它将在 2 秒后运行,正如函数内部所述。此函数将进入回调队列,并一直保留在那里,直到调用堆栈为空。事件循环将持续循环,并将异步函数从回调队列移至调用堆栈。

😅 所以,这种同步异步编程的过程给了我们多线程或并发程序的错觉,但实际上并非如此。

📍 使用 Cluster 模块

现在,我们知道问题在于我们无法使用 NodeJS 的多线程处理不同的进程。但有一个简单的方法可以解决这个问题。我们可以使用 Cluster 模块在多个 CPU(多核 CPU)上运行我们的服务器或 API。这将提高服务器的效率。我们还将看到使用Cluster 模块和不使用Cluster 模块给服务器增加负载时,性能提升的矩阵。

NodeJS 集群

📍 实现

注意:-您可以在此Git Repo中找到完整的代码

  • 使用集群或多 CPU
const express = require('express');
const cluster = require('cluster');
const os = require('os');

const app = express();
const numCpus = os.cpus().length;
const PORT = 3000;

app.get('/', (req, res)=>{
    for (let i = 0; i < 1e8; i++) {
        //   
    }
    res.send(`OK :- ${process.pid}`);
    // cluster.worker.kill(); 
})

if(cluster.isMaster){
    for (let i = 0; i < numCpus; i++) {
        cluster.fork();
    }
    cluster.on('exit', (worker, code, signal)=>{
        console.log(`worker ${worker.process.pid} died`);
        cluster.fork();
    })
}else{
    app.listen(PORT, ()=>console.log(`Server Working with pid ${process.pid} at localhost with port `+PORT));
}

// app.listen(PORT, ()=>console.log("Server Working at localhost with port "+PORT));
Enter fullscreen mode Exit fullscreen mode
  • 我们的简单程序没有聚类
const express = require('express');
const cluster = require('cluster');
const os = require('os');

const app = express();
// const numCpus = os.cpus().length;
const PORT = 3000;

app.get('/', (req, res)=>{
    for (let i = 0; i < 1e8; i++) {
        //   
    }
    res.send(`OK :- ${process.pid}`);
    // cluster.worker.kill();
})

app.listen(PORT, ()=>console.log("Server Working at localhost with port "+PORT));
Enter fullscreen mode Exit fullscreen mode

👉 集群代码中,重要的是要理解我们正在检查程序是否是主程序。如果是,那么我们将服务器设置为与 CPU 核心相同的数量,并在不同的核心上运行。注意,这里 fork() 确实会创建一个子进程。

我有 8 核 CPU,你可以看到我的服务器有 8 个实例正在运行

多核进程

注意:为了测试负载,我们在这里使用 loadtest。命令:loadtest -n 1000 -c 100 http://localhost:3000/

📍 负载测试

  • 使用集群模块

负载测试

  • 使用简单程序

NodeJS 演示程序

🎉您可以清楚地看到延迟的差异,无论是平均延迟还是在一定时间内服务的请求百分比

😇 注意:现在,您可以使用 Cluster Module 提高程序的运行效率。但别忘了对程序进行负载测试。


感谢阅读,希望对您有所帮助。关注我们,获取更多深入、实用的教程。

鏂囩珷鏉ユ簮锛�https://dev.to/ssd/scale-node-js-app-using-cluster-module-3bg8
PREV
宣布推出 Interaqt:为后端带来反应性
NEXT
构建应用程序时一次性使用 ReactJS、MongoDB、JS、CSS