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

Posted

技术标签:

【中文标题】Socket.io 命名空间限制以及如何扩展它【英文标题】:Socket.io namespace limit and how to scale it 【发布时间】:2016-09-19 16:50:31 【问题描述】:

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

更新1:

我要解决的问题如下,我有一个多人纸牌游戏(如扑克),每个房间都有 4 个玩家玩游戏,由 socketio 命名空间建模。由于我期望有成千上万的并发玩家,我的 socketio 实例应该处理这么多的命名空间。 我已经实现了Socket.io website 中解释的可扩展性解决方案。当我向外扩展时,这个节点 sn-p 我在新实例中运行,因此它可以处理之前创建的所有命名空间。

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 对象,并且有一个主对象维护所有现有命名空间对象的索引。除了 Javascript 对象及其在 ndoe.js 进程中的实例数据消耗的内存量之外,您可以拥有多少内存并没有固有的限制。似乎快速测试您创建所需的命名空间数量并测量它们的内存消耗将是一个很好的第一步。

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

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

【讨论】:

@hamou92 - 你有什么理由不将每个游戏建模为room 而不是命名空间。我相信房间是 socket.io 中比命名空间更轻的对象,我认为房间仍然可以为您提供所需的通信功能。 在做出选择之前我已经做了一些研究。似乎命名空间提供了更多的分离***.com/questions/10930286/… @hamou92 - 这回答了你的问题吗? 我想是的。谢谢

以上是关于Socket.io 命名空间限制以及如何扩展它的主要内容,如果未能解决你的问题,请参考以下文章

Socket.IO:如何删除命名空间

动态命名空间 Socket.IO

Socket.IO 命名空间,调用未定义函数 .of()

使用 socket.io-client.java 库连接到 socket.io 命名空间

Socket.io 命名空间和服务器不共享中间件?

socket.io切换命名空间