socket.io的可扩展架构

str*_*sim 8 sockets process node.js socket.io

我是socket.io和Node JS的新手,我正在尝试构建一个具有大量同时套接字连接(10,000+)的可伸缩应用程序.

目前,我开始使用我的服务器创建子进程的模型,并且每个子进程都侦听附加了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] });;
  }
});
Run Code Online (Sandbox Code Playgroud)

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);
        });
    }
});
Run Code Online (Sandbox Code Playgroud)

如果我在那里做了一些可怕的事情,请随意释放海妖

jfr*_*d00 9

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

更多的服务器实例(至少达到服务器中的CPU数量)将为您提供更多的CPU处理能力(如果这就是您需要的).如果大多数空闲时,它不一定会增加您可以支持的最大连接数.为此,您必须自定义调整服务器以支持大量和多个连接.

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

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

这是一篇来自socket.io doc的文章,介绍如何使用带有负载均衡器的多个节点来增加容量:Socket.io - 使用多个节点.redis还明确支持多个socket.io实例和redis 的组合,因此无论进程如何,您都可以与任何socket.io实例进行通信.