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

标签 c# asp.net signalr signalr-hub

如果我有许多属于我的集线器 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 相比,这些函数出乎意料地慢:

Profiler results

关于c# - 向空的 ASP.NET SignalR 组广播会浪费资源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39197870/

相关文章:

asp.net-mvc - SignalR - 建立连接需要很长时间

c# - 如何从 C# 应用程序检索 git Commit Id?

c# - 带有 moq 的模拟方法返回 null throws NullReferenceException

asp.net - 如何实现 zopfli 以获得更好的 gzip 压缩?

asp.net - HtmlEditorExtender 默认样式

signalr - 使用 Signalr/PersistentConnection 将服务器消息发送到连接的客户端

c# - 无法从 C#.NET 更新 Access 数据库文件

c# - 在 Redis 缓存对象中执行搜索

c# - FlickrNet API - 从 PhotoSearch 获取集合名称

javascript - SignalR 更改中心订阅