SignalR是否真的向所有连接的客户端广播每条消息?

时间:2014-05-29 10:16:42

标签: signalr xsockets.net

我们目前正在评估实施服务器发送事件的解决方案(不是使用服务器发送事件事件源传输进行的。)

我们的用例实际上与Stackoverflow非常相似。我们有一个自定义CMS实现为SPA,支持协作编辑。作为第一步,当另一个用户修改了它时,我们希望服务器通知同一页面上的所有客户

显而易见的选择是为此选择SignalR,但XSockets's comparison page上的这句话让我想到了:

  

如果框架将数据广播到我们刚刚连接的所有客户端   颠倒了AJAX问题,现在我们有一台锤击客户端的服务器   他们不想要的信息。

SignalR 2仍然如此吗?我的意思是不会向所有客户广播,不管团体会员资格如何使团体首先完全没用?

一些统计信息

  • > 10000个活跃用户
  • > 10000页

3 个答案:

答案 0 :(得分:2)

当您向群组发送消息时,群组中的客户端不会收到该消息。这基于服务器上的发布/订阅模型(因此当您使用组时,不是客户端决定它是否对该消息感兴趣),因此没有"锤击所有客户"在这种情况下继续。

我认为XSockets团队在本段中讨论的是,使用XSockets,您可以更好地控制发送消息的人员。因此,您可以发送给具有某些属性的客户端(有点像动态组),而不是发送到具有特定名称的组(您必须首先创建):

  

但是如果你想发送给范围内的所有客户,会发生什么   从y开始x km?或者,如果你想只针对25到30岁之间的男性   有红头发的人

您必须编写自己的代码才能在SignalR中执行此操作。例如,这可以在maps users to connections的代码之上完成。一个简单的解决方案(不一定是最好的)可以使用LINQ根据您感兴趣的属性选择适当的用户,然后从ConnectionMapping实例中获取所有相应的连接ID以发送给。

答案 1 :(得分:2)

发送到signalr中的组的消息只会到达该组中的客户端。因此,如果您使用群组,则无需担心广播。 团队很聪明,除非你必须做像@LarsHöppner所描述的那样,团队不是动态的,他们真的只是一个非常简单的订阅。这就像有pub / sub,你说你订阅了一个主题“A”,但在SignalR你是一个“A”组的成员。

如果您不使用群组,信号器将广播,这可以,但考虑到这一点。

你有2页“A”和“B”,它们都连接到Hub“MyHub”。 当您向所有客户端发送消息时,从“MyHub”到方法“MyMessage”,并且只有页面“A”实现了“MyMessage”的客户端方法,页面“B”上的客户端仍然会将该消息发送到浏览器,如果你在框架选项卡中查看(在chrome中) 因此,消息将到达对消息不感兴趣的客户端,在您收到大量客户端或发送敏感数据之前,这些消息不会很大。

如果您从未从2个不同的页面连接到同一个集线器,那么您将没事。如果你总是使用团体,你也会没事的。否则你将不得不考虑消息的到达位置!

主题: - 我最喜欢的信号器是运输方便! - 关于信号器的最糟糕的事情是他们有传输,因为他们已经设计了它认为websockets是一个操作系统功能(win8 2012服务器来获取websockets)

答案 2 :(得分:1)

在SignalR中,您可以订阅主题(组)并仅为您订阅的主题和全局消息获取消息。

Working with groups.

我不完全确定该段意味着什么。