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

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?

如何为 icarousel 中的每个按钮创建单独的操作?

J组外部端口选择控制

如何为在 EC2 模式下运行在 AWS ECS 集群中的容器分配公共 IP

如何为严密的防火墙配置 Apache Spark 随机工作端口?