嗨,我正在开发一个使用SignalR向客户端发送数据更新的应用程序。数据访问是通过权限控制的,每个数据记录(Item
)包含对一个权限的引用。用户与角色相关联,每个角色都与一组权限相关联。 允许任何给定用户仅查看引用其(用户)角色中的权限的记录。
假设您在50个角色中随机分布的系统中拥有500个权限,还有1000个用户在线并随机关联到系统中定义的那50个角色。因此,某些用户将包含唯一的权限集,也可能存在具有相同角色集且因此具有相同权限集的用户。
假设其中一个用户更改了800
个记录,并且每个记录都会引用系统中定义的500个权限之一。
现在要通知用户该更改,应该向每个尊重用户发送一条消息,其中包含一组用户有资格查看的记录。这意味着,根据用户拥有的一组权限,他可能会收到:
如果我将单独发送消息给每个客户端,那么我是否会受到性能下降的影响:
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条消息,这些消息通过组更有效地发送。
提前谢谢!
答案 0 :(得分:1)
您的理解重新连接处理是正确的; SignalR将单独和顺序处理每个客户端连接。由于它是基于HTTP的,因此无法进行多播。
因此,在许多情况下,与使用Clients.All
或Clients.Group(name)
相比,在循环客户列表时不会有很大的性能损失。组主要是方便的,因此使用您自己的实现来解决客户端子集应该没问题。
一个不同之处在于,如果您单独对每个客户端进行寻址,则每次都会对数据进行序列化,这可能是相关的,尤其是当您向许多用户发送包含大量记录的相同数据时。因此,根据您通常发送的用户数以及数据序列化所需的时间长短,您最好使用组。如果每个用户的数据是唯一的,并且每个用户通常只有一个连接,那么显然它不会有所作为。