Socket.io名称空间限制以及如何扩展它

时间:2016-05-22 22:23:32

标签: node.js socket.io scalability

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

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 个答案:

答案 0 :(得分:1)

socket.io中的命名空间只是一个Javascript对象,并且有一个主对象维护所有现有命名空间对象的索引。除了在ndoe.js进程中Javascript对象及其实例数据消耗的内存量之外,没有固有的限制。看来快速测试可以创建所需的命名空间数量并测量它们的内存消耗,这是一个很好的第一步。

您可以通过部署多个node.js进程来扩展node.js中的socket.io。这个一般概念在socket.io站点(Using multiple nodes)上讨论。该通用方案通过使用redis来管理希望在多个实例之间共享的数据。此方案不会为特定实例上的特定用户创建首选项。如果你想做类似的事情,为了在每个实例中只有一些命名空间,那么这可能是通过自定义编码来完成的,但你必须解释更多关于你试图解决的问题我们对如何处理这个问题有很多想法。

同样,如果您分享了您尝试解决的实际问题(而不仅仅是您尝试的解决方案),我们可能会通过使用您自己的数据结构提出一个比10k实际命名空间更高效的解决方案针对您的特定问题而不是通用命名空间。