nodejs+cluster+express 构建高性能Web服务器

前言

nodejs本身是单线程模型的,可以借助cluster模块实现多进程,增加程序在多核CPU机器上的性能表现,充分发挥nodejs的优势。

express算是nodejs中比较流行的Web开发框架了,假如你的网站使用的是express开发的,那么恭喜你,你只需添加少量的代码就可以实现多进程模式,重要的是这些进程可以共享一个端口哦。

如何实现

这里直接贴出代码了,关键点请看注释:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/**
 * index.js 
 */
var cluster = require('cluster');
var numCPUs = require('os').cpus().length;

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('exit', function(worker, code, signal) {
    console.log('worker ' + worker.process.pid + ' died');
  });
} else {
  // Code to run if we're in a worker process
  require('./app');
  console.log('Worker ' + cluster.worker.id + ' running!');
}

以上代码中我们根据CPU的数量创建对应的进程数。假设我们原来的express启动代码为app.js那么只需要在工作者进程中执行require(‘./app’)就可以了,改成多进程非常方便。

注意

cluster模块现在还处于实验阶段,不过使用ab测试了下,性能比单进程的提高了很多,大家可以自己去测下,这里就不给出测试数据了。