最佳性能 - 通过循环或房间发射到插座



我们目前有一个聊天应用程序,当向适当的用户(可能是 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]]);
}
}
}

必须循环访问套接字连接似乎效率低下,我想知道是否有更好的方法。 我的想法是为每个用户创建一个房间,大多数用户只有一个连接,但有些用户将通过多个设备连接,这样他们的房间中就可以有多个插座。 然后我只会广播到适当的房间,而不是总是循环遍历所有套接字。 鉴于 95% 的用户只有一个套接字连接,我不确定这种方法是否更有效,并希望对此提供一些意见。 谢谢。

首先,socket.io 已经为每个用户创建了一个房间。 那个房间有socket.id的名字。 房间是非常轻巧的物体。 它们基本上只包含一个对象,其中包含房间中套接字的所有 ID。 因此,使用房间应该毫不犹豫。 如果它们符合您正在做的事情的模型,请使用它们。

至于循环自己与发射到房间,实际上没有区别 - 使用使您的代码更简单的任何一种。 当您向房间发出信号时,它所做的只是循环访问房间中的套接字并分别发送到每个套接字。

必须循环访问套接字连接似乎效率低下,我想知道是否有更好的方法。

房间的主要优点是它们是预先构建的套接字关联,因此您不必动态确定要发送到哪些套接字 - 在正确的房间中已经有一个可以发送到的套接字列表。 因此,只发送到房间中的所有套接字可能比执行代码正在执行的操作更有效,因为您的代码正在动态尝试确定要发送到哪个套接字,而不是发送到已经创建的列表。 这会有所作为吗? 这取决于整个套接字列表有多长,以及确定要发送到哪些套接字的计算成本。 我的猜测是,无论哪种方式,它都不会有太大区别。

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

然后我只会广播到适当的房间,而不是总是循环遍历所有套接字。

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

我会用 Socket.io 房间来完成你想做的事情。

服务器端,将客户端添加到聊天室:

socket.join('some room');

然后,我将使用socket.to('some room').emit将发件人消息发送给会议室中的所有参与者。

最新更新