在尝试使用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位的套接字数组中,反之亦然。
优点:
缺点:
我的问题
我的解决方案是否有任何问题我没有考虑过?这个问题的现有解决方案是否比我的更好?
修改
其他一些问题: