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 应用程序的差异。

Architecture

应用程序服务器连接

自承载 ASP.NET Core SignalR 应用程序服务器侦听客户端并直连到客户端。

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

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

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

启动应用程序服务器后:

  • 对于 ASP.NET Core SignalR:Azure SignalR 服务 SDK 将为 SignalR 服务开放每个中心的五个 WebSocket 连接。
  • 对于 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 token>"
      }
      
    • 对于 ASP.NET SignalR,典型的重定向响应如下所示:
      {
          "ProtocolVersion":"2.0",
          "RedirectUrl":"https://test.signalr.azure.cn/aspnetclient",
          "AccessToken":"<a typical JWT token>"
      }
      
  3. 客户端在收到重定向响应后,它将使用 URL 和访问令牌连接到 SignalR 服务。

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

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

客户端连接到 SignalR 服务后,服务运行时将查找服务器连接,以便为此客户端提供服务。

  • 此步骤只发生一次,它是客户端与服务器连接之间的一对一映射。
  • 在客户端或服务器断开连接之前,SignalR 服务中会一直保持这种映射。

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

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

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

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

后续步骤

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