Nodejs express 如何使用cluster 运行?
Nodejs express 如何使用cluster 运行?
现在express 是使用./bin/www 来运行。看了下里面的代码是这样
#!/usr/bin/env node
var debug = require('debug')('seller');
var app = require('../app');
app.set('port', process.env.PORT || 3001);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
我要使用cluster是否改这里的代码?可否给个小例,谢谢!
要在 Node.js 中使用 Express 并结合 cluster
模块来提高应用的性能,特别是在多核 CPU 环境中,你可以通过简单的代码修改来实现。cluster
模块可以帮助你创建多个工作进程,每个进程运行在不同的 CPU 核心上,从而提升应用的并发处理能力。
下面是一个简单的示例,展示如何在 Express 应用中使用 cluster
模块:
修改后的 bin/www
首先,你需要对 bin/www
文件进行一些修改,以便它可以利用 cluster
模块。以下是修改后的代码示例:
#!/usr/bin/env node
const cluster = require('cluster');
const numCPUs = require('os').cpus().length;
// 如果当前进程是主进程
if (cluster.isMaster) {
console.log(`主进程 ${process.pid} 正在运行`);
// 创建指定数量的工作进程
for (let i = 0; i < numCPUs; i++) {
cluster.fork();
}
// 监听工作进程退出事件
cluster.on('exit', (worker, code, signal) => {
console.log(`工作进程 ${worker.process.pid} 已退出`);
console.log(`重启一个新工作进程`);
cluster.fork();
});
} else {
// 如果当前进程是工作进程
const debug = require('debug')('seller');
const app = require('../app');
app.set('port', process.env.PORT || 3001);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
process.on('SIGTERM', () => {
server.close(() => {
console.log(`工作进程 ${process.pid} 收到终止信号并关闭服务器`);
process.exit(0);
});
});
}
解释
- 主进程 (
cluster.isMaster
): 主进程负责创建相同数量的工作进程(即 CPU 核心数),并在工作进程退出时自动重启它们。 - 工作进程 (
!cluster.isMaster
): 每个工作进程都独立地启动 Express 应用,并监听指定的端口。当接收到终止信号(如SIGTERM
)时,它们会优雅地关闭服务器。
通过这种方式,你可以有效地利用多核 CPU 的优势,提高应用的并发处理能力和整体性能。
var debug = require(‘debug’)(‘my-application’); var app = require(’…/app’); var cluster = require(‘cluster’) var numCPUs = require(‘os’).cpus().length;
if(cluster.isMaster){
console.log("宿主启动...");
for (var i = 0; i < numCPUs; i++) {
cluster.fork();
}
cluster.on('listening',function(worker,address){
console.log('核心'+i+' pid:'+ worker.process.pid);
});
cluster.on('exit', function(worker, code, signal) {
console.log('核心'+i+' pid:'+ worker.process.pid+' 重启')
setTimeout(function() {cluster.fork();},2000);
});
}else{
app.set(‘port’,88);
var server = app.listen(app.get(‘port’),function() {
});
}
//已经按照你的配置改动了下。这个是会自动延迟重启线程的代码。也就是所谓的NODE不会挂。但是错误还是要排查。
看了lz的需求可以啊,都集群了,考虑多线程了,真棒~
为什么我只开启2个,而线程中有3个?
收藏了
利用pm2吧,不要自己开了
用 passenger 管理进程。
收藏 自豪地采用 CNodeJS ionic
要使用 cluster
模块来运行你的 Node.js Express 应用,你需要对现有的启动脚本进行一些修改。cluster
模块可以帮助你在多核 CPU 上更高效地利用资源。以下是如何实现的步骤和示例代码:
- 引入 cluster 模块:在文件顶部添加
const cluster = require('cluster');
- 检查当前进程是否为主进程:使用
if (cluster.isMaster)
判断。 - 创建工作进程:对于每个核心,创建一个工作进程。
- 主进程处理退出事件:确保当主进程接收到退出信号时,能够优雅地关闭所有子进程。
示例代码
假设你的 ./bin/www
文件内容如下:
#!/usr/bin/env node
var debug = require('debug')('seller');
var app = require('../app');
app.set('port', process.env.PORT || 3001);
var server = app.listen(app.get('port'), function() {
debug('Express server listening on port ' + server.address().port);
});
你可以修改成这样:
#!/usr/bin/env node
var debug = require('debug')('seller');
var app = require('../app');
// 引入 cluster 模块
const cluster = require('cluster');
const os = require('os');
// 获取 CPU 核心数
const numCPUs = os.cpus().length;
// 设置端口
app.set('port', process.env.PORT || 3001);
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(app.get('port'), () => {
debug(`Express server listening on port ${app.get('port')} in worker ${process.pid}`);
});
}
解释
- cluster.isMaster:如果当前进程是主进程,则执行相应逻辑。
- cluster.fork():为每个 CPU 核心创建一个工作进程。
- cluster.on(‘exit’):监听工作进程退出事件,并重新创建工作进程以保持应用运行。
- app.listen:在工作进程中启动服务器。
通过这种方式,你可以利用 cluster
模块提高 Node.js 应用的性能,特别是在多核服务器上。