将数据发送到单个客户端,而不是使用SignalR中的Clients.All

时间:2014-09-05 22:06:39

标签: asp.net signalr signalr-hub

摘要

嗨,我正在开发一个使用SignalR向客户端发送数据更新的应用程序。数据访问是通过权限控制的,每个数据记录(Item)包含对一个权限的引用。用户与角色相关联,每个角色都与一组权限相关联。 允许任何给定用户仅查看引用其(用户)角色中的权限的记录。

实施例

假设您在50个角色中随机分布的系统中拥有500个权限,还有1000个用户在线并随机关联到系统中定义的那50个角色。因此,某些用户将包含唯一的权限集,也可能存在具有相同角色集且因此具有相同权限集的用户。

假设其中一个用户更改了800个记录,并且每个记录都会引用系统中定义的500个权限之一。

问题(权限导致用户之间的数据散布)

现在要通知用户该更改,应该向每个尊重用户发送一条消息,其中包含一组用户有资格查看的记录。这意味着,根据用户拥有的一组权限,他可能会收到:

  • 如果他没有适当的权限,则根本没有记录,也没有任何通知
  • 如果他只有部分权限,则会有一些部分记录(少于800)
  • 所有800条记录,如果他拥有所有必需的权限

问题

如果我将单独发送消息给每个客户端,那么我是否会受到性能下降的影响:

var data = GetData();
var users = GetConnectedUsers();

foreach (var user in users)
{
    var filteredData = FilterByPermissions(user, data);

    foreach (var connectionId in user.Connections)
    {
        Clients.Client(connectionId).onData(filteredData);
    }
}

我之前正在寻找socket.io的NodeJS实现,并且它正在做普通的foreach发送数据,如果我理解正确,那么在引擎盖下的SignalR Clients.All执行相同的foreach循环,我会在我试图做。

这样做可以吗?而不是使用Clients.All.onData(...)?我已经阅读了与WebFarm上托管应用程序相关的此类方法的一些问题。

使用SignalR群组可以获得性能优势吗?我认为可以根据他拥有的权限将每个用户分组。如果用户与100-150个SignalR组相关联,是否可以。如果这是真的,那将是一个问题,因为它更有利于在一条消息中向用户发送整组数据,而不是将其分成100-150条消息,这些消息通过组更有效地发送。

提前谢谢!

模型图

Here is the link to an image

Image description

1 个答案:

答案 0 :(得分:1)

您的理解重新连接处理是正确的; SignalR将单独和顺序处理每个客户端连接。由于它是基于HTTP的,因此无法进行多播。

因此,在许多情况下,与使用Clients.AllClients.Group(name)相比,在循环客户列表时不会有很大的性能损失。组主要是方便的,因此使用您自己的实现来解决客户端子集应该没问题。

一个不同之处在于,如果您单独对每个客户端进行寻址,则每次都会对数据进行序列化,这可能是相关的,尤其是当您向许多用户发送包含大量记录的相同数据时。因此,根据您通常发送的用户数以及数据序列化所需的时间长短,您最好使用组。如果每个用户的数据是唯一的,并且每个用户通常只有一个连接,那么显然它不会有所作为。