用NodeJS实现集群计算

来源:岁月联盟 编辑:exp 时间:2012-10-10

Node的单个实例运行在单个的线程中,要充分利用多核系统,我们可以运行Node进程集群来处理负载。

也就是说,如果系统有8核,单个Node实例只能使用其中1核,可以利用cluster包的workers概念来充分利用所有的核。有趣的是,它们可以共享同一个端口。

该模块还处于实验阶段。
[javascript] 
var cluster = require('cluster'); 
var http = require('http'); 
var numCPUs = require('os').cpus().length; 
  
if (cluster.isMaster) { 
  // Fork workers. 
  require('os').cpus().forEach(function(){ 
    cluster.fork(); 
  }); 
  // In case the worker dies! 
  cluster.on('exit', function(worker, code, signal) { 
    console.log('worker ' + worker.process.pid + ' died'); 
  }); 
  // As workers come up. 
  cluster.on('listening', function(worker, address) { 
    console.log("A worker with #"+worker.id+" is now connected to " +/ 
     address.address +/ 
    ":" + address.port); 
  }); 
  // When the master gets a msg from the worker increment the request count. 
  var reqCount = 0; 
  Object.keys(cluster.workers).forEach(function(id) { 
    cluster.workers[id].on('message',function(msg){ 
      if(msg.info && msg.info == 'ReqServMaster'){ 
        reqCount += 1; 
      } 
    }); 
  }); 
  // Track the number of request served. 
  setInterval(function() { 
    console.log("Number of request served = ",reqCount); 
  }, 1000); 
  
} else { 
  // Workers can share the same port! 
  require('http').Server(function(req, res) { 
    res.writeHead(200); 
    res.end("Hello from Cluster!"); 
    // Notify the master about the request. 
    process.send({ info : 'ReqServMaster' }); 
  }).listen(8000); 

在一个4核的计算机上,输出如下:
[javascript]
Number of request served =  0 
A worker with #2 is now connected to 0.0.0.0:8000 
A worker with #4 is now connected to 0.0.0.0:8000 
A worker with #1 is now connected to 0.0.0.0:8000 
A worker with #3 is now connected to 0.0.0.0:8000 
Number of request served =  0 
... 
Number of request served =  2 
.. 
Number of request served =  4 
... 
Number of request served =  6