2015-07-10 35 views
2

如果我错了,请纠正我,但无法在同一端口上启动多个http服务器。将请求传递给特定分叉节点实例

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

关键是:每个员工都需要自己的记忆,所以你需要x倍多的记忆,其中x是工作人员的数量

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

它不接缝可能。无论是基于资源还是基于域。

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

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

回答

1

这是可能的:你需要创建在主网络服务器,并通过你的规则通过连接到工人的http服务器:

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(); 
     } 
    }); 
}