如果我有许多客户端连接属于我的集线器Hub_X
,但当前不属于特定组Group_Y
,那么broadcast()
到{{1}是不好的做法}?我应该跟踪我的Group_Y
内是否有人,并在广播之前进行相应的检查吗?
或Group_Y
在检测到signalR
中没有人时基本上不起作用,因此使用的资源可以忽略不计(相比之下,必须跟踪谁在我自己的一组)。 ?
答案 0 :(得分:5)
向你所描述的空组广播确实会有一些开销,但根据你的使用情况,这可能是微不足道的。
假设您有100,000条消息要在队列中处理。处理任何这些消息可能需要您向正在观看该数据的客户端发送SignalR消息,但绝大多数消息都没有观察者。
您可以使用消息/实体ID作为组的名称,并为100,000条消息中的每条消息执行如下代码:
var hub = GlobalHost.ConnectionManager.GetHubContext(hubName);
var group = hub.Clients.Group(groupName) as GroupProxy;
if (group != null)
{
group.Invoke(actionName, messageData);
}
或者,如果您能够以某种方式管理实际拥有客户(或可能拥有客户端)的HashSet
个组,那么您可以像这样修改代码:
var activeGroups = new HashSet<string>();
...
if (activeGroups.Contains(groupName))
{
var hub = GlobalHost.ConnectionManager.GetHubContext(hubName);
var group = hub.Clients.Group(groupName) as GroupProxy;
if (group != null)
{
group.Invoke(actionName, messageData);
}
}
这第二个例子似乎有些过分,并且介绍了管理activeGroups
的复杂性(可能在Hub
的自定义子类中完成)。此外,我原本预计SignalR内部已经做了类似的事情。但是,当我使用100,000个消息和零客户端(即:每个组为空)对此进行基准测试时,我在第一个示例上获得2.5秒,在第二个示例上获得0.006秒。无论SignalR在内部处理空组,它的效率肯定低于HashSet
查找。
在Visual Studio性能分析器中运行第一个测试(慢速测试),确认大部分工作都在内部SignalR功能中,与HashSet
相比,这些功能出乎意料地慢: