使用socket.io发送直接消息

时间:2015-08-31 19:45:56

标签: javascript node.js socket.io chat

在尝试使用socket.io和node.js创建实时聊天时,我偶然发现了一个理论问题。

问题

在套接字连接经过身份验证后,我将套接字存储在一个列表中,这样我就可以跟踪经过身份验证的套接字及其所属的用户。

当用户向另一个用户发送消息时,该消息首先存储在数据库中。存储消息后,服务器将循环通过经过身份验证的套接字列表,以查看接收方是否在线。如果接收者在线,则立即发送消息,如果接收者不在线,他/她将在首次加载页面时在数据库中找到他/她的消息历史记录。

通过上述解决方案,如果同时有大量用户在线,会发生什么?在实时聊天中,用户经常在短时间内发送大量消息,并且如果服务器必须在每次用户发送消息时遍历所有在线用户,那么服务器将会遇到一些严重的问题,对吧?

我最初的想法是将套接字的会话ID存储在数据库中,因为MongoDB不需要O(n)的时间来查找数据库条目。在我的情况下,这实际上是不可能的,因为我的网站将有许多不同的视图,每次用户更改视图时,都会创建一个新的套接字。如果新的套接字ID经常存储在数据库中,由于node.js的异步事件性质,可能会出现问题,对吗?

我的解决方案

解决这个问题的唯一想法是创建一个“足够大”的空数组:

var sockets = new Array(100*1000);

当创建一个新用户时,它会根据当前现有用户的数量给出一个id(用户编号54将被赋予id 54等)。

创建新套接字时,它将存储在套接字数组中由授权用户的id定义的位置(存储在数据库中)。

因此,当具有数据库ID 54的人 A 向具有数据库ID 125的人 B 发送直接消息时,如果B人当前在线,则服务器将知道 ,她/他的套接字将位于125位的套接字数组中,反之亦然。

优点:

  • 在数组中直接建立索引(套接字[125])比循环遍历所有套接字要快得多。
  • 页面加载将具有复杂度O(1 + k),其中k是socket.io建立套接字连接所需的复杂性。
  • 当用户获得一个新套接字时,交换旧套接字是安全的,因为不需要异步函数来更改套接字数组中的套接字(与需要调用异步的mongodb不同)函数)。

缺点:

  • “足够大”的空数组可能会浪费很多内存。
  • 如果用户数量超过“足够大”的限制,则必须更改应用程序才能使其再次运行。

我的问题

我的解决方案是否有任何问题我没有考虑过?这个问题的现有解决方案是否比我的更好?

修改

其他一些问题:

  • 是否可以在javascript中使用O(1)时间内的数组进行直接访问?
  • 具有10万个空对象的数组大约需要多少内存?

0 个答案:

没有答案