节点集群:如何为每个工作人员分配单独的服务器/端口?
Posted
技术标签:
【中文标题】节点集群:如何为每个工作人员分配单独的服务器/端口?【英文标题】:Node Cluster: How to assign separate server/port to each worker? 【发布时间】:2015-10-24 09:23:06 【问题描述】:我知道我可以使用 Nodes cluster
模块来创建多个服务于同一个套接字连接的工作人员(来自文档的示例):
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);
但是,如果我不提供相同的连接,而是希望每个工作人员运行自己的服务器,每个工作人员都在单独的端口上侦听,该怎么办?
【问题讨论】:
我认为集群的主要原因是暗示多线程和有效地使用系统进程..就像一个连接与4个进程共享以平衡负载..尝试使用子进程来执行一堆服务器(不只是一个想法) 为什么要这样做?感觉就像XY problem。 @AaronDufour 我正在尝试对多个socket.io
实例进行负载平衡。在我们正在开发的应用程序中,用户分组的核心单元是一个组织,我希望每个组织都有自己的 socket.io 服务器和自己的端口。
@csvan 我认为如果所有进程都监听所有端口,你会获得更好的性能,这样每个端口都会负载平衡,但我还是回答了你的问题。
【参考方案1】:
您可以将环境变量传递给每个子进程,让主进程为它们分配端口:
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);
【讨论】:
我想要带有上游的 nginx 负载均衡器。这对我帮助很大。但是我很困惑哪个更好?Node.js 自己的集群或 Nginx 负载均衡器还是另一个?以上是关于节点集群:如何为每个工作人员分配单独的服务器/端口?的主要内容,如果未能解决你的问题,请参考以下文章
如何为层中的每个节点为 Keras relu 函数分配自定义 alpha?