2016-09-14 78 views
1

我有点奇怪的网站设计。我使用的是socket.io,并且必须维护每个连接用户的套接字对象,以汇集来自单独应用程序的响应。在性能明显下降之前,可以在内存中的JS对象中保存多少个socket.io对象?

我存储插槽这样的:

var clients = {}; 

//further down, in socket.io code: 
io.sockets.on('connection', function(socket){ 
    clients[socket.id] = socket; 
    .... 

当客户端请求进来,我包括插座ID,并把它用于处理其他应用程序。当响应进来,我deque的连接和:

if(returned_object.socketid){ 
    if(clients[d.socketid]){ 
     clients[d.socketid].emit('res', returned_object); 
    } 
    ... 

现实,多少个并发连接可能我希望之前,我注意到性能的滞后呢?我想知道它是在几十,几百还是几千。显然,我在每个插座disconnect上使用delete

我也考虑过在与leveldb或其他数据库连接时将每个套接字写入磁盘。

感谢

+0

不是一个真正的答案,而是来自个人经验 - 假设合理的代码,你应该可以在服务器上做好几千个,并且通过持久化客户端到REDIS(或数据库)而不是内存并通过多台服务器进行通信。如果所有你想要的都是消息传递,那么达到50k个并发用户的难度并不是很难。 –

+0

仅供参考,您不必维护您自己的由他们的id索引的套接字映射。这已经由'io.sockets.connected'中的socket.io自动完成了。这正是你的'客户'对象已经是除了它是由socket.io自动为你维护的。 – jfriend00

+0

如果您为大量开放式套接字正确配置服务器,则可能会受到连接数存在内存问题之前长时间处理单个进程的流量限制。因此,除非大多数套接字闲置,否则您的实际缩放比例可能会受到您未提及的任何有关流量处理问题的限制。 – jfriend00

回答

1

万家是一个很好的估计你开始看到演出前“下降,”即使这样,可能并不明显,直到你达到20K或50K socket对象。如果考虑套接字对象的内存大小与标准Apache连接的大小(上次读取的每个连接为2-3MB),那么您实际上没有太多需要关注的内容。