广播到一个空的ASP.NET SignalR组会浪费资源吗?

时间:2016-08-29 02:51:06

标签: c# asp.net signalr signalr-hub

如果我有许多客户端连接属于我的集线器Hub_X,但当前不属于特定组Group_Y,那么broadcast()到{{1}是不好的做法}?我应该跟踪我的Group_Y内是否有人,并在广播之前进行相应的检查吗?

Group_Y在检测到signalR中没有人时基本上不起作用,因此使用的资源可以忽略不计(相比之下,必须跟踪谁在我自己的一组)。 ?

1 个答案:

答案 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相比,这些功能出乎意料地慢:

Profiler results