将请求传递给特定的分叉节点实例

时间:2015-07-10 11:43:24

标签: node.js request cluster-computing

如果我错了,请纠正我,但是不可能在同一个端口上启动多个http服务器。

基于此,有趣的是NodeJS集群可能会分叉。因为我知道主人是什么将请求传递给其中一个分叉的工人。操作系统管理的工作人员或cluster.schedulingPolicy =" rr" for" round robin"。

重点是:每个工作人员都需要自己的记忆,所以你需要x倍的内存,其中x是工人的数量

但是如果我想从我的节点应用程序中运行不同的(子)域,我还想保持绑定到(子)域的in_memory数据库的不同部分(例如,简单的JSON文件)。或者基于subdomain.example.tdl/resource1/whatever等资源。

它没有接缝可行。基于资源或基于域。

在我看来应该是可能的,因为我可以通过不同的现有中间件基于请求对象(res.url)和资源(params)进行路由。

这样就可以告诉主服务器将请求传递给特定的分叉实例。

1 个答案:

答案 0 :(得分:1)

有可能:您需要在master上创建net server,并通过规则将连接传递给worker http server:

var cluster = require('cluster');

if (cluster.isMaster) {
    var workers = [];    

    // Create workers
    for (var i=0; i<require('os').cpus().length; i++) {
        workers[i] = cluster.fork({WORKER_INDEX:i, JSON_INDEX:i});
    }

    // Create net server at master
    var server = require('net').createServer({pauseOnConnect:true}, function(c) {
        var b = Math.floor( Math.random()*workers.length );
        workers[b].send("doit",c);
    }).listen(3000);
} else {

    // Load specific data for worker (pass parametr JSON_INDEX)
    var json = "{default:default}";   
    try {
        json = require("fs").readFileSync('./data_'+process.env.JSON_INDEX+'.json');
    } catch (e) {}

    // Create http server and pass specific json to client
    var server = require('http').createServer( function(req, res) {
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end(json);
    }).listen(0,'127.0.0.1');

    // Get message from master and check if need pass to http server
    process.on('message', function(m,c) {
        if ( "doit" === m ) {
            server.emit('connection', c);
            c.resume();
        }
    });
}