Azure SignalR 服务 内部

Azure SignalR 服务基于 ASP.NET Core SignalR 框架构建。 它还通过在 ASP.NET Core 框架之上重新实施 ASP.NET SignalR 的数据协议,支持 ASP.NET SignalR。

可以通过更改几行代码轻松迁移本地 ASP.NET Core SignalR 或 ASP.NET SignalR 应用程序以使用SignalR 服务。

此图描述了将SignalR 服务用于应用程序服务器时的典型体系结构。

还讨论了与自托管的 ASP.NET Core SignalR 应用程序之间的差异。

体系结构

应用程序服务器连接

自托管的 ASP.NET Core SignalR 应用程序服务器直接侦听并连接客户端。

使用SignalR 服务,应用程序服务器不再接受永久性客户端连接,而是:

  1. Azure SignalR 服务 SDK 为每个中心公开一个negotiate 终结点。
  2. 终结点响应客户端协商请求并将客户端重定向到SignalR 服务。
  3. 客户端连接到SignalR 服务。

有关详细信息,请参阅客户端连接

启动应用程序服务器后:

  • 对于 ASP.NET Core SignalR:Azure SignalR 服务 SDK 针对每个集线器打开五个 WebSocket 连接,以便与 SignalR 服务进行通信。
  • 对于 ASP.NET SignalR:Azure SignalR 服务 SDK 为每个中心向 SignalR 服务打开五个 WebSocket 连接,并为每个应用程序 WebSocket 连接打开一个。

初始连接数默认为 5,可使用 SignalR 服务 SDK 中的 InitialHubServerConnectionCount 选项进行配置。 有关详细信息,请参阅配置

当应用程序服务器连接到 SignalR 服务时,Azure SignalR 服务会将负载均衡消息发送到服务器。 然后,SDK 将在服务器与服务之间启动新连接,以提高性能。 发自和发往客户端的消息被多路复用到这些连接中。

服务器连接将持续连接到“SignalR 服务”。 如果网络问题导致服务器连接断开:

客户端连接

使用SignalR 服务时,客户端将连接到服务而不是应用程序服务器。 在客户端与SignalR 服务之间建立持久连接有三个步骤。

  1. 客户端向应用程序服务器发送协商请求。

  2. 应用程序服务器使用 Azure SignalR 服务 SDK 返回包含SignalR 服务 URL 和访问令牌的重定向响应。

    • 对于 ASP.NET Core SignalR,典型的重定向响应如下所示:
      {
          "url":"https://test.signalr.azure.cn/client/?hub=chat&...",
          "accessToken":"<a typical JWT>"
      }
      
    • 对于 ASP.NET SignalR,典型的重定向响应如下所示:
      {
          "ProtocolVersion":"2.0",
          "RedirectUrl":"https://test.signalr.azure.cn/aspnetclient",
          "AccessToken":"<a typical JWT>"
      }
      
  3. 客户端收到重定向响应后,它使用 URL 和访问令牌连接到SignalR 服务。

若要详细了解 ASP.NET Core SignalR,请参阅 Transport 协议

客户端与服务器之间的数据传输

当客户端连接到SignalR 服务时,服务运行时会找到一个服务器连接来为此客户端提供服务。

  • 此步骤只发生一次,它是客户端与服务器连接之间的一对一映射。
  • 映射在 SignalR 服务中维护,直到客户端或服务器断开连接。

此时,应用程序服务器会收到一个事件,其中包含来自新客户端的信息。 在应用程序服务器中与客户端建立逻辑连接。 通过SignalR 服务从客户端到应用程序服务器建立数据通道。

SignalR 服务将数据从客户端传输到配对应用程序服务器。 应用程序服务器中的数据将发送到映射的客户端。

SignalR 服务不保存或存储客户数据,接收的所有客户数据将实时传输到目标服务器或客户端。

Azure SignalR 服务充当应用程序服务器和客户端之间的逻辑传输层。 所有持久性连接都会卸载到SignalR 服务。 因此,应用程序服务器只需处理中心类中的业务逻辑,而无需担心客户端连接。

后续步骤

若要详细了解 Azure SignalR SDK,请参阅: