【问题标题】:Does SignalR really broadcast every message to all connected clients?SignalR 真的向所有连接的客户端广播每条消息吗?
【发布时间】:2014-05-29 10:16:42
【问题描述】:

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

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

显而易见的选择是为此选择 SignalR,但 XSockets's comparison page 上的这个声明让我思考:

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

SignalR 2 仍然如此吗?我的意思是,不管组成员身份如何,向所有客户广播不会首先使组完全无用吗?

一些统计数据

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

【问题讨论】:

    标签: signalr xsockets.net


    【解决方案1】:

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

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

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

    如果您从不从 2 个不同的页面连接到同一个集线器,那就没问题了。如果你总是使用组,你也会没事的。否则你将不得不考虑消息将到达哪里!

    主题: - 我最喜欢 signalr 的地方是漂亮的运输工具! - 关于signalr最糟糕的事情是他们有传输,因为他们设计它认为websockets是一个操作系统功能(win8 2012服务器获取websockets)

    【讨论】:

    • 不想播就不用播了;正如我在回答中所说,您可以简单地动态收集相关的连接 ID 并发送给他们;它只需要一些额外的代码来以某种方式获取连接 ID 列表,这取决于您如何实现用户状态
    • 是的,我同意这一点!但我认为在 signalr 中发送给一部分客户端的方式非常难看。当我们需要控制消息的发送位置时,我们使用 xsockets,但有时我们也使用信号器。这取决于我们正在构建什么。普通网络我们通常使用信号器,因为传输正常工作!当我们必须连接其他客户端、控制或需要更快的速度时,我们使用 xsockets。喜欢这两种解决方案,但它们都有缺点,但大多数事情都有!
    • 你怎么知道“发送到 SignalR 中的组的消息只会到达该组中的客户端”。您能否提供一些文档或代码的链接,以显示服务器如何知道将消息发送给谁。 documentation 表示“服务器不维护组列表或组成员身份。这有助于最大限度地提高可扩展性,因为每当您将节点添加到网络场时,SignalR 维护的任何状态都必须传播到新节点。”
    • @BentleyDavis - 我实际上不知道这种情况,但如果小组不能那样工作,为什么要有他们。如果群组广播它们是一个严重的安全风险恕我直言
    【解决方案2】:

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

    我认为 XSockets 团队在本段中所说的是,使用 XSockets,您可以更细粒度地控制向谁发送消息。因此,您可以发送给具有特定属性的客户端(有点像动态组),而不是发送到具有特定名称的组(您必须先创建):

    但是如果你想发送给范围内的所有客户端会发生什么 距离 y 的 x 公里?或者,如果您只想定位 25 到 30 岁之间的男性 红头发的那一年

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

    【讨论】:

      【解决方案3】:

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

      Working with groups.

      我不完全确定该段落的含义。

      【讨论】:

        猜你喜欢
        • 2021-09-02
        • 1970-01-01
        • 2019-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-02
        • 1970-01-01
        • 2019-01-06
        相关资源
        最近更新 更多