Express.js应用的多进程运行-cluster模块与Express集群

 2016年03月05日    2184     声明


Node.js程序是单进程运行的,使用Express框架开发的Web应用同样也是。当使用多核系统时,这会导致对多核资源的浪费。这时,我们可以使用Node.js的cluster模块创建一个多核集群,让Express应用多进程运行,充分利用多核资源。


1. 修改启动文件

创建Express应用后,其默认是单进程运行。我们将对其启动文件bin/www修改如下:

#!/usr/bin/env node
var debug = require('debug')('my-application');
var app = require('../app');

app.set('port', process.env.PORT || 3000);

var cluster = require('cluster');
var http = require('http');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork启一个Worker 进程
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('listening', (worker, address) => {
    console.log('worker ' + worker.process.pid +', listen: '+address.address+":"+address.port);
  });

  cluster.on('exit', (worker, code, signal) => {
    console.log('worker ' + worker.process.pid + ' died');
    //重启一个worker进程
    cluster.fork();
  });
} else {
  // Worker 进程之间可以共享任何形式的TCP连接
  // 也可以启动一个express的web服务
  app.listen(app.get('port'));
}

在Node.js的cluster模块中,分为主进程Master和工作进程Worker两种对象。Master一般用于进程的管理,如:在子进行异常退出后重启一个子进程,而子进行用于具体的事务处理。

在上面示例中,我们主进程用于启动及重启子进程,而子进程用于运行HTTP服务器。


2. 程序的多进程运行

修改完成后,我们通过node bin/www命令启动程序,会看到类似如下输出:

worker 17963, listen: null:3000
worker 17966, listen: null:3000
worker 17964, listen: null:3000
worker 17965, listen: null:3000

这样,就实现了Express应用的多进程运行。当用户发起HTTP请求时,请求会被随机会配到一个工作进程中进行处理。


更多关于cluster模块的介绍请参考:cluster模块让Node.js充分利用多核资源