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

Does broadcasting to a ASP.NET SignalR group that is empty waste resources?

如果我有很多属于我的集线器 Hub_X 的客户端连接,但目前不属于特定组 Group_Y,那么 broadcast()Group_Y?我是否应该跟踪我的 Group_Y 中是否有人,并在向它广播之前进行相应检查?

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

像您描述的那样广播到空组确实有一些开销,但根据您的用例,它可能可以忽略不计。

假设您有 100,000 条消息要在队列中处理。处理任何这些消息可能需要您向正在监视该数据的客户端发送 SignalR 消息,但绝大多数消息都没有监视程序。

您可以使用 message/entity 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 相比出乎意料地慢: