可扩展的socket.io架构

16

我刚开始接触 socket.io 和 Node.js,并尝试构建一个具有大量并发 socket 连接(10,000+)的可扩展应用程序。

目前,我基于一个模型开始了工作,在该模型中我的服务器创建子进程,每个子进程都使用附加了 socket.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);
        });
    }
});

如果我做了什么可怕的事,请随意释放海怪

2个回答

24

首先,你需要优化的内容取决于你的socket.io连接有多忙,以及活动是否主要是异步I/O操作还是CPU密集型任务。你可能已经知道,node.js对于异步I/O方面已经具有很好的可伸缩性,但是对于CPU密集型任务,它需要多个进程才能良好地扩展。此外,有些情况下垃圾回收器会变得太忙(大量小请求被处理),因此出于这个原因,你也需要选择多个进程。

更多的服务器实例(至少与服务器中CPU数量相同)将为您提供更多的CPU处理能力(如果这是您所需要的)。如果你的连接大部分处于闲置状态,那么这并不一定会增加你可以在一台机器上支持的最大连接数。为了达到这个目的,你必须自定义调整您的服务器来支持大量连接。

通常,你不会想要让N个socket.io服务器每个监听一个不同的端口。这会让客户端负担重重,需要客户端选择一个端口,并且客户端必须确切地知道要从哪些端口进行选择(例如,你有多少个服务器实例)。

通常,你不会这样做。通常,你有N个进程都在监听同一个端口,并使用某种负载均衡器将负载分配给它们。这使得服务器基础架构对客户端透明,这意味着你可以扩展服务器的数量而无需改变客户端行为。事实上,你甚至可以添加多个物理服务器盒子以进一步增加能力。

这是socket.io文档中关于使用负载均衡器增加容量的文章:Socket.io - using multiple nodes (updated link)。还有一种方法是使用redis与多个socket.io实例的组合,因此你可以与任何进程无关地进行通信。


3
拥有多个socket.io实例在多个端口上是否增加了可能的连接数?
是的,您已经构建了一个简单的负载均衡器,这是一种相当常见的做法。有几个很好的教程介绍了不同的扩展node.js的方法。
- 使用redis水平扩展socket.io - http://goldfirestudios.com/blog/136/Horizontally-Scaling-Node.js-and-WebSockets-with-Redis 您的负载均衡器会加速代码到一定程度,因为您利用了多个线程,但我之前在其他线程上读到的一个经验法则是每个CPU核心启动大约2-3个进程。超过这个数量会导致更多的开销而不是帮助,但这高度依赖于情况。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接