用NodeJS实现集群计算

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

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

该模块还处于实验阶段。


[javascript] view plaincopyprint?
  1. var cluster = require('cluster');  
  2. var http = require('http');  
  3. var numCPUs = require('os').cpus().length;  
  4.    
  5. if (cluster.isMaster) {  
  6.   // Fork workers.  
  7.   require('os').cpus().forEach(function(){  
  8.     cluster.fork();  
  9.   });  
  10.   // In case the worker dies!  
  11.   cluster.on('exit'function(worker, code, signal) {  
  12.     console.log('worker ' + worker.process.pid + ' died');  
  13.   });  
  14.   // As workers come up.  
  15.   cluster.on('listening'function(worker, address) {  
  16.     console.log("A worker with #"+worker.id+" is now connected to " +\  
  17.      address.address +\  
  18.     ":" + address.port);  
  19.   });  
  20.   // When the master gets a msg from the worker increment the request count.  
  21.   var reqCount = 0;  
  22.   Object.keys(cluster.workers).forEach(function(id) {  
  23.     cluster.workers[id].on('message',function(msg){  
  24.       if(msg.info && msg.info == 'ReqServMaster'){  
  25.         reqCount += 1;  
  26.       }  
  27.     });  
  28.   });  
  29.   // Track the number of request served.  
  30.   setInterval(function() {  
  31.     console.log("Number of request served = ",reqCount);  
  32.   }, 1000);  
  33.    
  34. else {  
  35.   // Workers can share the same port!  
  36.   require('http').Server(function(req, res) {  
  37.     res.writeHead(200);  
  38.     res.end("Hello from Cluster!");  
  39.     // Notify the master about the request.  
  40.     process.send({ info : 'ReqServMaster' });  
  41.   }).listen(8000);  
  42. }  

在一个4核的计算机上,输出如下:



[javascript] view plaincopyprint?
  1. Number of request served =  0  
  2. A worker with #2 is now connected to 0.0.0.0:8000  
  3. A worker with #4 is now connected to 0.0.0.0:8000  
  4. A worker with #1 is now connected to 0.0.0.0:8000  
  5. A worker with #3 is now connected to 0.0.0.0:8000  
  6. Number of request served =  0  
  7. ...  
  8. Number of request served =  2  
  9. ..  
  10. Number of request served =  4  
  11. ...  
  12. Number of request served =  6  

上一篇:用NodeJS实现集群计算


下一篇:大型互联网应用系统的演化过程