我是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] });;
}
});
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);
});
}
});
如果我做了一些可怕的事情,请随意释放海妖
答案 0 :(得分:6)
首先,您需要优化的内容取决于您的socket.io连接的繁忙程度以及活动主要是异步I / O操作还是CPU密集型内容。正如您可能已经知道的那样,node.js已经很好地扩展了异步I / O的功能,但它需要多个进程才能很好地扩展CPU密集型内容。此外,在某些情况下,垃圾收集器太忙(需要提供大量的小请求),因此您还需要转到多个进程。
更多服务器实例(至少达到服务器中的CPU数量)将为您提供更多的CPU处理能力(如果您需要的话)。如果大多数空闲的话,它不一定会增加你可以在盒子上支持的最大连接数。为此,您必须custom tune your server来支持大量的连接。
通常,您不希望N个socket.io服务器分别在不同的端口上侦听。这会给客户端带来负担,以某种方式选择一个端口,客户端必须确切地知道要选择哪些端口(例如,您有多少个服务器实例)。
通常,你不这样做。通常,您有N个进程都在同一端口上侦听,并且您使用某种负载均衡器来分配它们之间的负载。这使得服务器基础结构对客户端透明,这意味着您可以在不改变客户端行为的情况下向上或向下扩展服务器。实际上,您甚至可以添加多个物理服务器盒,并以此方式进一步提高容量。
这是来自socket.io doc的一篇文章,介绍如何使用带负载均衡器的多个节点来增加容量:Socket.io - using multiple nodes。还有redis for a combination of multiple socket.io instances和redis的明确支持,因此无论进程如何,您都可以与任何socket.io实例进行通信。
答案 1 :(得分:2)
在多个端口上有多个socket.io实例会增加可能的连接数吗?
是的,您构建了一个简单的负载均衡器,这是一种非常常见的做法。关于缩放node.js的不同方法,有几个很好的教程。
您的负载均衡器会将您的代码加速到一定程度,因为您使用多个线程,但我前一段时间读过其他一些线程,经验法则是每个CPU核心启动2-3个进程。不仅如此,还会产生更多的开销,但这很大程度上取决于情况。