最佳性能-通过回路或房间发射到插座

Tro*_*roy 2 socket.io

当前,我们有一个聊天应用程序,通过该应用程序,当向适当的用户发出消息时(可能是1个或几个,具体取决于会话中有多少个),我们将所有套接字(Socket.io 2.0.2)连接都循环到服务器(NodeJS),根据成员ID值获取用户拥有的套接字列表,因为每个用户都可以从多个设备连接。代码看起来像这样,以便确定用户应使用哪个套接字发送消息,

    var sockets = Object.keys(socketList);
    var results = [];
    for (var key in sockets) {
        if (hasOwnProperty(socketList[sockets[key]].handshake.query, 'token')) {
            if (JSON.parse(socketList[sockets[key]].handshake.query.member).id === memberId) {
                results.push(socketList[sockets[key]]);
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

必须循环通过套接字连接似乎效率很低,我想知道还有没有更好的方法。我的想法是为每个用户创建一个房间,大多数用户只有一个连接,但是有些用户将通过多个设备连接,因此他们的房间中可以有多个插座。然后,我只是广播到适当的房间,而不是总是在所有插座上循环播放。鉴于95%的用户只能使用一个套接字连接,因此我不确定这种方法是否更有效,并且希望对此有所投入。谢谢。

jfr*_*d00 5

首先,socket.io已经为每个用户创建了一个房间。那个房间的名字叫socket.id。房间是很轻的物体。它们基本上只是由一个具有房间内所有套接字ID的对象组成。因此,应该毫不犹豫地使用房间。如果它们适合您的工作模型,请使用它们。

至于将自己循环到发射到房间,实际上并没有什么区别-使用任何一种可使您的代码更简单。当您发射到一个房间时,所要做的就是通过房间中的插座循环并单独发送给每个房间。

必须循环通过套接字连接似乎效率很低,我想知道还有没有更好的方法。

房间的主要优点是它们是套接字的预先建立的关联,因此您不必动态地找出要发送给哪个套接字-在正确的房间中已经有可以发送到的套接字列表。因此,仅发送到一个房间中的所有套接字比执行代码正在做的工作效率要高一点,因为您的代码正在动态地试图找出要发送给哪个套接字,而不是发送给已经完成的套接字清单。这会有所作为吗?这取决于整个套接字列表有多长时间,以及计算出要发送给哪个套接字的计算成本。我的猜测是,这两种方式可能都不会有太大的不同。

在实际发送部分,将消息发送到房间并没有效率更高。每个套接字都必须单独发送消息,以便有人(您的代码或socket.io房间代码)将以任何一种方式遍历套接字列表。基础操作系统不包含将单个消息发送到多个套接字的功能。每个套接字必须单独发送到。

然后,我只是广播到适当的房间,而不是总是在所有插座上循环播放。

发送到房间对于您来说是编程上的便利,但是无论如何,socket.io只会在幕后循环。