首页 文章

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

提问于
浏览
2

如果我错了,请纠正我,但是无法在同一端口上启动多个http服务器 .

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

重点是: Every worker needs its own memory, so you need x-times much memory where x is the number of workers .

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

它不接缝 . 基于资源或基于域 .

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

因此,应该可以告诉主服务器将请求传递给特定的分叉实例 .

1 回答

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

相关问题