节点群集:如何为每个工人分配单独的服务器/端口?

我明白,我可以使用节点cluster模块为了创build几个工作人员都服务于相同的套接字连接(例如从文档):

 var cluster = require('cluster'); var http = require('http'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { // Fork workers. for (var i = 0; i < numCPUs; i++) { cluster.fork(); } cluster.on('exit', function(worker, code, signal) { console.log('worker ' + worker.process.pid + ' died'); }); } else { // Workers can share any TCP connection // In this case its a HTTP server http.createServer(function(req, res) { res.writeHead(200); res.end("hello world\n"); }).listen(8000); } 

但是,如果我而不是服务于同一个连接,那么每个工作人员都需要运行自己的服务器,每个服务器都在单独的端口上监听

您可以将环境variables传递给每个subprocess,从而允许主进程为其分配端口:

 var cluster = require('cluster'); var numCPUs = require('os').cpus().length; if (cluster.isMaster) { var pidToPort = {}; var worker, port; for (var i = 0; i < numCPUs; i++) { port = 8000 + i; worker = cluster.fork({port: port}); pidToPort[worker.process.pid] = port; } console.log(pidToPort); cluster.on('exit', function(worker, code, signal) { // Use `worker.process.pid` and `pidToPort` to spin up a new worker with // the port that's now missing. If you do so, don't forget to delete the // old `pidToPort` mapping and add the new one. console.log('worker ' + worker.process.pid + ' died'); }); } else { // Start listening on `process.env.port` - but first, remember that it has // been cast to a string, so you'll need to parse it. console.log(process.env.port); }