【问题标题】:SignalR connection affinity in web-farm scenarioWeb-farm 场景中的 SignalR 连接亲和性
【发布时间】:2014-02-19 23:08:54
【问题描述】:

我的应用程序有以下要求:在 JavaScript(客户端)和服务器(ASP.NET)之间打开一个连接。此连接必须能够在中等时间内来回发送数据,并在关闭之前保持有状态(与 REST 调用不同)。也就是说,在连接期间,客户端基本上与服务器具有亲和力(在 web-farm 场景中)。

我已经阅读了很多关于 SignalR 和 WebSockets 的一般信息,但我不知道这是否是它的运作方式。

我不关心网络农场中服务器之间的服务器->服务器通信,因为这已经通过代码解决了。我只需要 JS 客户端和它最初联系的服务器在连接期间保持联系。

这是如何工作的,如果不是,这可能吗?此外,如果可能的话,如何在多个呼叫/广播的连接期间将信息存储在内存中?

【问题讨论】:

    标签: javascript asp.net websocket signalr


    【解决方案1】:

    请记住,尽管 SignalR 透明地为您做了很多事情,但 4 种底层传输完全不同。

    只有 WebSockets 和 SSE 是持久连接。 ForeverFrame 和 LongPolling 是重复的 HTTP 请求,因此如果您有多个服务器以循环方式进行负载平衡,则您无法控制每个调用的去向。

    一种解决方案是使用具有粘性会话的负载平衡器。这种负载平衡器会在 HTTP 请求中查找特定的 cookie,以设置特定服务器的关联性。

    其他解决方案是使用 SignalR 背板,因此您不必介意您的请求去向,背板确保连接获得正确的消息:

    http://www.asp.net/signalr/overview/signalr-20/performance-and-scaling/scaleout-in-signalr

    每个服务器实例都通过总线连接到背板。当一个 消息发送,到背板,由背板发送 到每个服务器。当服务器从背板收到消息时,它 将消息放入其本地缓存中。然后服务器传递消息 从本地缓存到客户端。

    对于每个客户端连接,客户端在读取 使用游标跟踪消息流。 (一个光标代表一个 在消息流中的位置。)如果客户端断开连接,然后 重新连接时,它会向总线询问在连接之后到达的任何消息 客户端的游标值。当连接使用时也会发生同样的事情 长轮询。长轮询请求完成后,客户端打开一个 新连接并询问光标后到达的消息。

    【讨论】:

    • 感谢您的深入回复。但是我很好奇“只有 WebSockets 和 SSE 是持久连接”的说法。假设我使用的是 websockets,只要它是打开的,通过负载平衡器建立的连接是否会一直保持在同一台机器上?如果是这样,这将解决问题。
    • 是的,WebSocket 连接将保持打开状态。只需确保中间没有不知情的代理和负载平衡来关闭连接。一些负载均衡器可能会将连接视为僵尸连接,因为它看起来像很长的 HTTP 连接。
    猜你喜欢
    • 2016-01-21
    • 1970-01-01
    • 2020-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 2021-12-09
    相关资源
    最近更新 更多