2015-07-10 34 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(); 
     } 
    }); 
}