在socket.io中创建太多房间有什么问题吗?

时间:2016-12-28 03:33:00

标签: socket.io

我正在考虑为每个基于用户ID连接的用户腾出空间。我会以这种方式遇到内存问题吗?或者当房间里所有连接的客户都不见时房间会消失吗?

1 个答案:

答案 0 :(得分:4)

socket.io中的一个房间只是一个Javascript对象,其中包含一个套接字列表。只要有一个插座,房间就存在。一旦房间中的最后一个插座断开或离开房间,房间对象本身就会被移除。

如果您没有意识到,socket.io已根据$this->output->enable_profiler(true) 值为每个用户创建了一个空间。所以,那已经存在了。

  

我会以这种方式遇到内存问题吗?

房间不是大型数据结构,当它们没有套接字时会自动清理,所以我不希望你的房间有内存问题。

  

或者当所有连接的客户都在那里时,房间会消失   房间不见了?

是的,当所有连接的客户端都将释放一个房间 房间不见了。

房间存储在适配器对象中(允许通过redis支持跨多个服务器的分布式房间的体系结构),因此socket.id方法最终告诉适配器从房间中移除套接字。适配器代码如下所示:

socket.leave(room)

你可以看到,在从套房中移除套接字之后,代码会检查当前长度是否为Adapter.prototype.del = function(id, room, fn){ this.sids[id] = this.sids[id] || {}; delete this.sids[id][room]; if (this.rooms.hasOwnProperty(room)) { this.rooms[room].del(id); if (this.rooms[room].length === 0) delete this.rooms[room]; } if (fn) process.nextTick(fn.bind(null, null)); }; ,如果是,则删除房间对象。