gpt4 book ai didi

asp.net - 将数据发送到各个客户端而不是使用 SignalR 中的 Clients.All

转载 作者:行者123 更新时间:2023-12-02 17:09:30 25 4
gpt4 key购买 nike

摘要

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

示例

假设系统中有 500 个权限随机分布在 50 个角色中,并且有 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

最佳答案

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

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

一个区别是,如果您单独寻址每个客户端,则数据每次都会被序列化,这可能是相关的,尤其是当您向许多用户发送包含大量记录的相同数据时。因此,根据您通常发送给的用户数量以及数据序列化所需的时间,您可能最好使用组。如果每个用户的数据都是唯一的,并且每个用户通常只有一个连接,那么显然这不会产生任何影响。

关于asp.net - 将数据发送到各个客户端而不是使用 SignalR 中的 Clients.All,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25694643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com