2016-05-23 115 views
0

在我们的应用程序中,我们需要发送推送通知给随机数的客户端。 我们没有办法为这些用户创建静态组,直到在 之前发送消息,因为数据已分类并且只能由特定用户看到。SignalR发送消息给随机数的客户端

我们正在尝试SignalR提供通知,但有一些怀疑是实施“发送”方法的最佳方式。

我们想知道下列哪一种选择是最具扩展性和高性能的解决方案,可将大约20条消息/秒发送到随机分组的多达3000个用户。

使用客户端方法?

API中的“客户”方法接受连接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); 
  • 有没有办法知道,如果消息被传递到属于该组的所有客户端?在向该组发送消息之后,我们希望/需要删除该组,因为它只会有效一次。

谢谢。

回答

1

我会与动态创建的组一起获得更好的性能,但也会在scaling out中查找。但你仍然必须保持track of the connections id到你的中心。

按照docs,一组如果有任何用户只存在:

实际上,一组会自动创建你到Groups.Add调用指定 它的名字第一次,它会在删除 最后一个来自成员身份的连接时被删除。

不幸的是,SignalR does not guarantee the message delivery。你可以自己实现这样的东西,但我不会建议等待用户接收消息。


后来编辑

既然你不打算重用组,这将是一个开销来创建它们只是为了传递一个消息。如果您确实没有关于如何将消息发送给用户的标准,将它们分组毫无意义。

因此,您可以做的最基本的事情是通过每个连接循环,并随机选择要发送到该连接的消息。这也将更容易扩展。

+0

谢谢你的回答弗洛林。关于小组,您建议删除哪种策略?我们将不会重复使用组,我们将每秒创建大约20组,所以我认为在SignalR中拥有这么多组会产生巨大的性能影响。 – Paulo

+0

嗨Paulo。没有连接时,组将被删除。 –

+0

再次感谢弗洛林。但是,如果任何用户总是连接,那么我将拥有所有的群体永远生活。你不觉得这会对性能造成影响吗? – Paulo

相关问题