0

我有一个问题……我想运行一个 NodeJS 套接字服务器(我的决定是使用 EngineIO,从阅读性能/跨浏览器/等……)并能够扩大规模(添加内核)。因此我想使用集群模块(即使在实验阶段,似乎每个人都说它可靠)。我考虑在 nginx 中使用负载均衡器,但对于这个项目来说似乎有点太复杂了(到处都提到这是高级选项)。

所以我需要解决的大问题是这样的:我需要在同一个线程上有两个不同的设备,这样他们就可以“说话”(第二屏解决方案> 例如这个:https ://www.google.com/ intl/en/chrome/browser/promo/supersync/)。反正EngineIO好像不支持共享存储(比如共享RedisStore),我觉得自己实现有点太高级了……

所以我正在考虑一个设置,我将每个进程工作人员放在不同的端口上,然后,当其中一个设备连接到该特定工作人员上的 EngineIO 实例(由 nodejs 集群负载平衡)时,它可以显示一个独特的代码(应该在第二个设备上输入),最后一个数字会让第二个设备知道要连接到哪个端口。我发现我需要粘性会话来使每个设备的连接保持在同一个线程上(或者至少是第一个设备,因为当我连接 EngineIO.

我设法在不同的端口上启动了多个工人......但感觉有些不对劲。我还没有找到任何关于开发人员实现这种结构的示例。也许这并没有错,但我觉得我应该得到别人的意见。所以我的问题是:在不同的端口上拥有不同的工作进程,以便能够知道与第二个设备连接到哪个端口是一个好主意吗?像这样的东西:

var cluster = require('cluster'),
http = require('http');

var numCPUs = require('os').cpus().length; // or just hardcode to 2, when not more than one cpu is available...

if (cluster.isMaster) {
  // Fork workers.
  for (var i = 0; i < numCPUs; i++) {
    cluster.fork();
  }

  cluster.on('listening', function(worker, address) {
    console.log("worker.id: " +  worker.id);
  });
} else {
  console.log("cluster.worker.id: " +  cluster.worker.id);

  http.createServer(function(req, res) {
    res.writeHead(200);
    res.end("hello world " + cluster.worker.id + "\n");
  }).listen(8000 + parseInt(cluster.worker.id));
}

当然,EngineIO 是解决方案的重要组成部分,它没有包含在上面的代码中,但这是下一步。

4

1 回答 1

0

您可以尝试 SocketCluster ( http://socketcluster.io/ ) - 它专为在多个 CPU 内核上运行而设计,并且它具有共享数据存储,用于在工作人员之间共享数据。它建立在 Engine.io 之上——我是主要贡献者。您应该查看 GitHub 页面的文档以查看它是否适合您:https ://github.com/TopCloud/socketcluster

于 2014-08-29T14:10:55.770 回答