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是否改这里的代码?可否给个小例,谢谢!


11 回复

要在 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 &lt; 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的需求可以啊,都集群了,考虑多线程了,真棒~

1.png 2.png 为什么我只开启2个,而线程中有3个?

收藏了

利用pm2吧,不要自己开了

lz的主程主要是用来处理什么逻辑业务?

用 passenger 管理进程。

收藏 自豪地采用 CNodeJS ionic

要使用 cluster 模块来运行你的 Node.js Express 应用,你需要对现有的启动脚本进行一些修改。cluster 模块可以帮助你在多核 CPU 上更高效地利用资源。以下是如何实现的步骤和示例代码:

  1. 引入 cluster 模块:在文件顶部添加 const cluster = require('cluster');
  2. 检查当前进程是否为主进程:使用 if (cluster.isMaster) 判断。
  3. 创建工作进程:对于每个核心,创建一个工作进程。
  4. 主进程处理退出事件:确保当主进程接收到退出信号时,能够优雅地关闭所有子进程。

示例代码

假设你的 ./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 应用的性能,特别是在多核服务器上。

回到顶部