在我们的应用程序中,我们需要向随机数量的客户端发送推送通知。 在此之前,我们无法为这些用户创建静态组 发送消息,因为数据是分类的,只能由特定用户查看。
我们正在尝试使用SignalR来提供通知,但对实施“发送”方法的最佳方式有一些疑问。
我们想知道以下哪个选项是最具扩展性和高性能的解决方案,可向最多3000个随机分组的用户发送大约20封/秒的消息。
使用客户端方法?
API中的“Clients”方法接受连接ID列表
Clients.Clients(clientIds).NewMessage(message);
发送给每个客户?
Clients.Client(clientId).NewMessage(message);
动态创建群组?
我们可以在发送之前立即创建群组。
var groupName = Guid.NewGuid().ToString();
foreach (var clientId in clientIds)
{
await Groups.Add(clientId, groupName);
}
Clients.Group(groupName).NewMessage(message);
谢谢。
答案 0 :(得分:1)
我会使用动态创建的组来获得更好的性能,但也会查看scaling out。但您仍需要将track of the connections id保留到您的中心。
根据docs,只有当有任何用户时才存在一个组:
实际上,第一次指定时会自动创建一个组 它在调用Groups.Add时的名称,并在删除时删除 来自会员的最后一次联系。
不幸的是,SignalR does not guarantee the message delivery。你可以自己实现这样的东西,但我不建议等待用户收到消息。
稍后修改
由于您不打算重用这些组,因此创建它们只是为了传递一条消息是一种开销。如果你真的没有关于如何将消息发送给用户的标准,那么将它们分组是没有意义的。
因此,您可以做的最基本的事情是遍历每个连接并随机选择要发送到该连接的消息。这也可以更容易扩展。