【问题标题】:having a global object with cluster module of node.js拥有一个带有 node.js 集群模块的全局对象
【发布时间】:2013-07-15 22:13:30
【问题描述】:

我在 Node.js 中基于 express 构建的 Rest api 应用程序中使用集群。

使用集群的 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);

}

我的问题是有什么方法可以让我拥有一个全局对象,就像代码中显示的不同分叉实例之间的计数器对象一样,以便所有实例都更新同一个对象?

【问题讨论】:

  • 您可以共享的方式是进程之间的“消息”系统,或其他一些消息传递协议,如 ZeroMQ。

标签: node.js rest resources express


【解决方案1】:

所有工作进程确实是独立的应用程序变量的新副本。

每个工作进程都是使用child_process.fork 创建的全功能进程。在文档中,您可以得到以下声明:

工人之间没有共享状态。因为工人都是分开的 进程,它们可以被杀死或重新生成,具体取决于您的 程序的需要,而不影响其他工作人员

所以答案是否定的,您不能共享变量counter,您的集群进程之间不会共享变量。

【讨论】:

    【解决方案2】:

    我是通过将共享资源更新部分移至 Master 来做到这一点的

    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 从子进程与主进程进行通信,并在主进程中保持更新部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2018-03-07
      • 1970-01-01
      • 2012-07-18
      • 1970-01-01
      相关资源
      最近更新 更多