2016-08-01 79 views
3

我是socket.io和Node JS的新手,我试图用大量的同步套接字连接(10,000+)构建一个可伸缩的应用程序。socket.io的可伸缩体系结构

目前,我开始创建一个模型,在该模型中我的服务器创建子进程,并且每个子进程使用附加的sicket.io实例来侦听特定的端口。一旦客户端连接,他将被重定向到特定的端口。

最大的问题是:几个端口上有多个socket.io实例会增加可能的连接数量吗?

这里是我的代码,以防万一:

服务器

var server = http.createServer(app); 

server.childList = []; 
for (var i = 0; i < app.portList.length; i++) { 
    server.childList[i] = require('child_process').fork('child.js'); 
} 

server.listen(3443,() => { 
    for (var i = 0; i < app.portList.length; i++) { 
    server.childList[i].send({ message: 'createServer', port: app.portList[i] });; 
    } 
}); 

child.js:

var app = require('./app'); 
var http = require('http'); 
var socket_io  = require("socket.io"); 

process.on('message', (m) => { 
    if (m.message === 'createServer') { 

     var childServ = http.createServer(app); 

     childServ.listen(m.port,() => { 
      console.log("childServ listening on port "+m.port); 
     }); 

     var io = socket_io(); 
     io.attach(childServ); 

     io.sockets.on('connection', function (socket) { 
      console.log("A client just connected to my socket_io server on port "+m.port); 
     }); 
    } 
}); 

随意释放海妖,如果我做了一件可怕的存在

回答

4

首先,你需要优化什么取决于你的socket.io连接的繁忙程度以及活动是否主要是异步I/O操作或是否是CPU密集型的东西。正如你可能已经知道的那样,node.js已经非常好地扩展了异步I/O的东西,但是它需要多个进程才能很好地适应CPU密集型的东西。此外,在某些情况下,垃圾收集器太忙(很多很多小的请求被提供),并且出于这个原因你也需要去多个进程。

更多的服务器实例(至少达到服务器中CPU的数量)将为您提供更多的CPU处理能力(如果这是您需要的)。如果大多数连接闲置,它不一定会增加一个盒子上可以支持的最大连接数量。为此,您必须custom tune your server才能支持大量连接。

通常,您不希望N个socket.io服务器每个都在不同的端口上侦听。这给客户端带来的负担是以某种方式选择一个端口,客户端必须确切地知道可以选择哪些端口(例如,有多少个服务器实例)。

通常,你不这样做。通常,你有N个进程都在同一个端口上进行侦听,并且你使用某种负载平衡器来分配负载。这使服务器基础架构对客户端透明,这意味着您可以在不改变客户端行为的情况下向上或向下扩展服务器。实际上,您甚至可以添加多个物理服务器盒,并以这种方式进一步增加容量。

以下是关于使用多个节点与负载平衡器来增加容量的socket.io文档:Socket.io - using multiple nodesredis for a combination of multiple socket.io instances和redis也有明确的支持,所以你可以与任何socket.io实例进行通信,而不管进程是什么。

2

哈哈在几个端口上运行几个socket.io实例会增加可能的连接数量?

是的,你已经建立了一个简单的负载平衡器,这是一个很常见的做法。有几个关于不同的缩放node.js的好方法。

负载平衡器,因为你使用多个线程,但前一阵子是一个经验法则是我的一些其他线程读取你的代码将加快到一个点每个CPU核心启动2-3个进程。不仅如此,还会带来更多的开销,但这很大程度上取决于情况。