Node.js socket.io的可扩展体系结构

Node.js socket.io的可扩展体系结构,node.js,sockets,process,socket.io,Node.js,Sockets,Process,Socket.io,我不熟悉socket.io和Node JS,我正在尝试构建一个具有大量并发套接字连接(10000+)的可伸缩应用程序 目前,我从一个模型开始,在这个模型中,我的服务器创建子进程,每个子进程侦听一个连接了sicket.io实例的特定端口。客户机连接后,会在特定端口上重定向 最大的问题是:在几个端口上有几个socket.io实例会增加可能的连接数吗? 这是我的代码,以防万一: 服务器 var server = http.createServer(app); server.childList = [

我不熟悉socket.io和Node JS,我正在尝试构建一个具有大量并发套接字连接(10000+)的可伸缩应用程序

目前,我从一个模型开始,在这个模型中,我的服务器创建子进程,每个子进程侦听一个连接了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] });;
  }
});
如果我在那里做了什么可怕的事,请释放海怪

在多个端口上有多个socket.io实例是否会增加可能的连接数

是的,您已经构建了一个简单的负载平衡器,这是一种非常常见的做法。关于缩放node.js的不同方法,有一些很好的教程


您的负载平衡器会将您的代码加速到一定程度,因为您使用了多个线程,但我不久前在另一个线程上读到,经验法则是每个cpu核心大约启动2-3个进程。不仅如此,还会导致更多的开销而不是帮助,但这在很大程度上取决于具体情况。

首先,您需要优化的内容取决于socket.io连接的繁忙程度,以及该活动主要是异步I/O操作还是CPU密集型操作。正如您可能已经知道的,node.js已经可以很好地扩展异步I/O内容,但它需要多个进程才能很好地扩展CPU密集型内容。此外,在某些情况下,垃圾回收器太忙(正在处理大量的小请求),因此您还需要转到多个进程

更多的服务器实例(至少达到您在服务器中拥有的CPU数量)将为您提供更多的CPU处理能力(如果您需要的话)。如果一个机箱中的大多数连接处于空闲状态,那么它不一定会增加您可以支持的最大连接数。为此,您必须支持大量的连接

通常,您不希望N socket.io服务器在不同的端口上侦听。这就给客户机带来了选择端口的负担,客户机必须准确地知道要选择哪些端口(例如,您有多少个服务器实例)

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

下面是socket.io文档中关于使用多个节点和负载平衡器来增加容量的文章:。和redis还提供了明确的支持,因此您可以与任何socket.io实例进行通信,而不必考虑进程

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);
        });
    }
});