使用 Cluster Module 扩展 Node JS 应用
📍 NodeJS 并发
🙂 说到编写后端(或者说 API),我们用 NodeJS 写代码非常快。但你知道 NodeJS 是单线程的吗?🥲。没错,单线程技术确实会降低我们应用程序的效率。
😌 但是我们可以在 NodeJS(或者一般的 JS)中使用异步编程,这可以简化并发编程。有一种叫做事件循环和回调队列的东西。
😊 就像这里一样,setTimeout() 是一个异步函数,它不会暂停后续代码行的执行(它们是同步的),并且它将在 2 秒后运行,正如函数内部所述。此函数将进入回调队列,并一直保留在那里,直到调用堆栈为空。事件循环将持续循环,并将异步函数从回调队列移至调用堆栈。
😅 所以,这种同步异步编程的过程给了我们多线程或并发程序的错觉,但实际上并非如此。
📍 使用 Cluster 模块
现在,我们知道问题在于我们无法使用 NodeJS 的多线程处理不同的进程。但有一个简单的方法可以解决这个问题。我们可以使用 Cluster 模块在多个 CPU(多核 CPU)上运行我们的服务器或 API。这将提高服务器的效率。我们还将看到使用Cluster 模块和不使用Cluster 模块给服务器增加负载时,性能提升的矩阵。
📍 实现
注意:-您可以在此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));
- 我们的简单程序没有聚类
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));
👉 集群代码中,重要的是要理解我们正在检查程序是否是主程序。如果是,那么我们将服务器设置为与 CPU 核心相同的数量,并在不同的核心上运行。注意,这里 fork() 确实会创建一个子进程。
我有 8 核 CPU,你可以看到我的服务器有 8 个实例正在运行
注意:为了测试负载,我们在这里使用 loadtest。命令:loadtest -n 1000 -c 100 http://localhost:3000/
📍 负载测试
- 使用集群模块
- 使用简单程序
🎉您可以清楚地看到延迟的差异,无论是平均延迟还是在一定时间内服务的请求百分比
😇 注意:现在,您可以使用 Cluster Module 提高程序的运行效率。但别忘了对程序进行负载测试。
感谢阅读,希望对您有所帮助。关注我们,获取更多深入、实用的教程。
鏂囩珷鏉ユ簮锛�https://dev.to/ssd/scale-node-js-app-using-cluster-module-3bg8