2016-05-22 42 views
0

我有socket.io应用程序必须处理大量的命名空间。我想知道什么是socket.io实例可以处理的命名空间的数量的限制,如果我创建像10k命名空间,是否有任何问题。我如何进行扩展,以便像在多个socket.io实例中一样进行堆栈(例如,每个实例处理1k个namespance)。实际上,我可以扩展以支持多个用户,但是我的所有实例都必须处理所有的名称空间。Socket.io命名空间的限制和如何扩展它

UPDATE1:

我试图解决的问题是下面,我有一个多人卡片游戏(如扑克牌),每间客房,其中4名玩家在玩游戏时,被socketio命名空间建模。由于我期待成千上万的并发玩家,因此我的socketio实例应该处理这个数量的命名空间。 我已经实现了在Socket.io website中解释的可伸缩性解决方案。当我扩展时,这个节点片段在新实例中运行,因此它可以处理之前创建的所有命名空间。

rooms.forEach(function(room){ 
    var socketRoom = io.of('/room/' + room.id) 
    .on('connection', function(mySocket){ 
     return handleTableSocket(mySocket, socketRoom, room); 
    }); 
}); 

那么用socketio命名空间模拟每个游戏房间是个好主意吗?如果命名空间的数量增长了呢?

干杯

回答

1

在socket.io名字空间只是一个Javascript对象,并有维持所有现有的命名空间对象的索引控对象。除了在ndoe.js过程中Javascript对象及其实例数据消耗的内存量之外,您可以拥有的内存数量没有内在限制。看起来,快速测试你创建你需要的命名空间的数量并测量它们的内存消耗将是一个好的第一步。

您可以通过部署多个node.js进程来缩放node.js中的socket.io。这里的一般概念在socket.io站点上讨论(Using multiple nodes)。该通用方案通过使用redis来管理想要在多个实例之间共享的数据。此方案不会为特定实例上的特定用户创建首选项。如果你想这样做,为了在每个实例中只有一些命名空间,那么这可能是用自定义编码完成的,但是你必须解释更多关于你试图解决的问题我们对如何解决这个问题有很多想法。同样,如果您分享了您试图解决的实际问题(而不是您刚才尝试的解决方案),那么我们可能会想出一个比10k实际名称空间更高效的解决方案,方法是使用您自己的数据结构比通用名称空间更针对您的特定问题。

+1

@ hamou92 - 你有没有任何理由将每个游戏都建模为一个“房间”而不是命名空间。我相信socket.io中的房间是一个比命名空间更轻的对象,我认为一个房间仍然会为您提供您想要的通信功能。 – jfriend00

+0

我在做出选择之前做了一些研究。它似乎像名称空间给更多的分离http://stackoverflow.com/questions/10930286/socket-io-rooms-or-namespacing – hamou92

+0

@ hamou92 - 这是否回答你的问题? – jfriend00

相关问题