如果我有许多属于我的集线器 Hub_X
的客户端连接,但目前不属于特定组 Group_Y
,那么 广播是否是一种不好的做法()
到 Group_Y
?我是否应该跟踪我的 Group_Y
中是否有人,并在向它广播之前进行相应检查?
或者当 signalR
检测到 Group_Y
中没有人时,它是否基本上不工作,因此使用的资源量可以忽略不计(相比之下,不得不我自己跟踪谁在一个组中)。 ?
最佳答案
像您描述的那样广播到空组确实有一些开销,但根据您的用例,它可能可以忽略不计。
假设您有 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
相比,这些函数出乎意料地慢:
关于c# - 向空的 ASP.NET SignalR 组广播会浪费资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39197870/