2013-07-15 35 views
2

我在node.js中的express上構建的Rest api應用程序中使用了集羣。有一個全局對象,其中包含node.js的集羣模塊

Rest API利用集羣的完整代碼是。

var cluster = require('cluster'); 
var numCPUs = require('os').cpus().length; 
var counter = {"color":{},"weight":{}}; 

if (cluster.isMaster) { 

     for (var i = 0; i < numCPUs; i++) { 
      cluster.fork(); 
     } 

     cluster.on('exit', function(worker, code, signal) {   
      var exitCode = worker.process.exitCode; 
      console.log('worker ' + worker.process.pid + ' died ('+exitCode+'). restarting...'); 
      cluster.fork();  
     }); 



} else {  

     var express = require("express"), 
     var msg; 
     var server = express();  
     server.use(express.bodyParser()); 
     server.post('/grouper', function (req, res) { 

      //some update on global counter   

     }); 

     server.listen(8080); 

} 

我的問題是有沒有什麼辦法我能有一樣的代碼不同的分叉實例之間所示的計數器對象,使所有的情況下更新相同對象的全局對象?

+1

您可以共享的方式是在進程或其他一些消息協議(如ZeroMQ)之間的「消息」系統。 – moka

回答

8

所有工作進程確實是您的應用程序變量的獨立副本。

每個工人都是使用child_process.fork創建的全功能工藝。在文件中你可以得到以下聲明:

工人之間沒有共享狀態。由於工人都是獨立的 進程,它們可以被殺死或重新催生取決於你 程序的需求,而不會影響其他工人

所以答案是否定的,你不能共享變量counter,您的羣集過程不共享變量。

1

我通過共享資源更新部分移動到主像

if (cluster.isMaster) { 

     for (var i = 0; i < numCPUs; i++) { 

      var worker = cluster.fork(); 

      worker.on('message', function(msg) { 

       //update counter according to attributes in msg   
       console.log(counter); 

      }); 


     } 

     // some code 



} else {  

     var express = require("express"), 
     var msg; 
     var server = express();  
     server.use(express.bodyParser()); 
     server.post('/grouper', function (req, res) { 

      //some update on global counter 
      msg = req.body; 
      //communicate to master here 
      process.send(msg);  

     }); 

     server.listen(8080); 

} 

process.send從子進程通信掌握並保持更新用部分在主這樣做。

相關問題