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

标签 node.js socket.io scalability

我有一个必须处理大量命名空间的 socket.io 应用程序。我想知道 socket.io 实例可以处理的命名空间数量的限制是多少,如果我创建 10k 个命名空间,是否会出现任何问题。我如何扩展以在多个 socket.io 实例之间进行类似分片的操作(例如,每个实例处理 1k 命名空间)。实际上,我可以扩展以支持多个用户,但我的所有实例都必须处理所有命名空间。

更新1:

我试图解决的问题如下,我有一个多人纸牌游戏(如扑克),每个房间(有 4 个玩家正在玩游戏)都是由 socketio 命名空间建模的。由于我预计有数千个并发玩家,因此我的 socketio 实例应该处理这么多的命名空间。 我已经实现了Socket.io website中解释的可扩展性解决方案。 。当我横向扩展时,我在新实例中运行此 Node 片段,以便它可以处理之前创建的所有命名空间。

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

那么用 socketio 命名空间对每个游戏室进行建模是一个好主意吗?如果命名空间的数量增加怎么办?

干杯

最佳答案

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

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

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

关于node.js - Socket.io 命名空间限制以及如何扩展它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37380279/

相关文章:

socket.io - 我如何允许 socket.io 用户加入具有多个命名空间的房间?

synchronization - 具有共享数据可扩展性的 CouchDB db-per-user

node.js - 使用回调返回字符串而不是 HTML 来表达渲染函数

javascript - 使用 Catberry 框架构建唯一组件 ID 的最佳实践是什么?

node.js - 在运行测试之前清理测试数据库

javascript - Socket.io - 发出 JS 对象导致最大递归错误,然后根本不发送

node.js - meteor 兼容性

Jenkins 多个大师

.net - 为什么在分配大量内存时我的线程化 .Net 应用程序不能线性扩展?

javascript - NodeJS + MySql 嵌套查询