Pon*_*nml 3 c# asp.net signalr signalr-hub
如果我有一个是我中心的一部分,许多客户端连接Hub_X,而是一组特定的不是目前一部分Group_Y,它不好的做法是broadcast()对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);
}
Run Code Online (Sandbox Code Playgroud)
另外,如果您能够以某种方式管理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);
}
}
Run Code Online (Sandbox Code Playgroud)
第二个示例似乎有些矫kill过正,并引入了管理的复杂性activeGroups(可能可以在的自定义子类中完成Hub)。此外,我希望SignalR内部已经在做完全像这样的事情。但是,当我用100,000条消息和零个客户端(即:每个组都是空的)对此进行基准测试时,第一个示例的时间为2.5秒,第二个示例的时间为0.006秒。无论SignalR在内部为处理空组所做的任何事情,其效率肯定都不如HashSet查找。
在Visual Studio性能分析器中运行第一个测试(慢速测试),确认大多数工作都在内部SignalR函数之内,与a相比,该过程出乎意料地慢HashSet:
| 归档时间: |
|
| 查看次数: |
425 次 |
| 最近记录: |