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

时间:2017-06-30 11:45:36

标签: socket.io

我们目前有一个聊天应用程序,当向适当的用户发出消息时(可能是1或几个,具体取决于对话中的数量)我们遍历所有套接字(Socket.io 2.0.2)与服务器的连接( NodeJS)获取用户基于成员ID值的套接字列表,因为每个用户可以从多个设备连接。代码看起来像是为了确定用户应该发送消息的套接字,

a <- quos(contains("c"), dplyr::starts_with("b"))
dplyr::select(df, !!a) # does not work
dplyr::select(df, !!!a) # does work

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

2 个答案:

答案 0 :(得分:4)

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

至于循环自己与发送到房间,真的没什么区别 - 使用哪个使你的代码更简单。当你发射到一个房间时,它只是循环通过房间里的插座并分别发送给每个房间。

  

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

房间的主要优点是它们是预先建立的套接字关联,因此您不必动态地确定要发送到哪个套接字 - 那里已经有一个套接字列表了你可以发送到正确的房间。因此,发送到一个房间中的所有套接字而不是执行代码所做的事情可能会更高效一点,因为代码是动态地试图找出要发送到哪个套接字,而不是发送到已经制作的套接字。名单。这会有所作为吗?这取决于整个套接字列表的长度以及计算要花费多少才能确定要发送哪些套接字。我的猜测是它可能无论如何都不会产生太大的影响。

在实际发送部分发送消息到房间效率不是很高。每个套接字都必须单独发送消息,这样某人(你的代码或socket.io房间代码)将以任何方式循环遍历套接字列表。底层操作系统不包含将单个消息发送到多个套接字的功能。每个插座都必须单独发送。

  

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

发送到房间对您来说是一种编程方便,但无论如何,socket.io都会在封面下循环。

答案 1 :(得分:1)

我会用Socket.io rooms来完成你想做的事。

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

socket.join('some room');

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