Azure SignalR 服务中的消息和连接

Azure SignalR 服务的计费模型基于连接数以及来自该服务的出站消息数。 本文介绍消息和连接数目的定义方式,以及它们如何影响计费。

消息格式

Azure SignalR 服务支持的格式与 ASP.NET Core SignalR 相同:JSONMessagePack

消息大小

以下限制适用于Azure SignalR 服务消息:

  • 客户端消息:
    • 对于长时间轮询或服务器端事件,客户端无法发送大于 1 MB 的消息。
    • 服务的 WebSocket 没有大小限制。
    • 应用服务器可以为客户端消息大小设置限制。 默认值为 32 KB。 有关详细信息,请参阅 ASP.NET Core SignalR 中的安全注意事项
    • 对于无服务器,消息大小受上游实现的限制,但建议小于 1 MB。
  • 服务器消息:
    • 对于服务器消息大小没有限制,但建议小于 16 MB。
    • 应用服务器可以为客户端消息大小设置限制。 默认值为 32 KB。 有关详细信息,请参阅 ASP.NET Core SignalR 中的安全注意事项
    • 无服务器:
      • Rest API:对于消息正文为 1 MB,对于标头为 16 KB。
      • 对于 WebSocket 没有限制(管理 SDK 持久模式),但建议小于 16 MB。

对于 WebSocket 客户端,大消息将拆分为每个不超过 2 KB 的较小消息并单独传输。 消息拆分与组合由 SDK 进行处理, 无需开发人员的干预。

大消息确实会对消息传送性能造成负面影响。 请尽量使用小消息,并通过测试来为每种使用方案确定最佳消息大小。

消息如何影响计费

发送到服务的消息是入站消息,从服务发出的消息是出站消息。 计费中只会统计来自 Azure SignalR 服务的出站消息。 将忽略客户端与服务器之间的 Ping 消息。

大于 2 KB 的消息算作多个大小为 2 KB 的消息。 每当每个中心出现 100 个消息时,Azure 门户中的消息计数图表就会更新。

例如,假设你有 1 个应用程序服务器和 3 个客户端:

  • 当应用程序服务器向所有已连接的客户端广播一条 1 KB 消息时,从应用程序服务器发送到服务的消息被视为免费入站消息。 从服务发送到每个客户端的三条消息是出站消息,并且会计费。

  • 当客户端 A 向客户端 B 发送一条 1 KB 入站消息时,该消息不会流经应用服务器,因此是免费入站消息。 从服务路由到客户端 B 的消息作为出站消息计费。

  • 如果你有三个客户端和一个应用程序服务器,当某个客户端发送一条 4 KB 消息,以便让该服务器将此消息广播到所有客户端时,计费的消息数为八个:

    • 从服务向应用程序服务器发送一条消息。
    • 从服务向客户端发送三条消息。 每条消息算作 2 条 2-KB 大小的消息。

如何统计连接数

Azure SignalR 服务创建应用程序服务器和客户端连接。 默认情况下,每个应用程序服务器启动时每个中心有五个初始连接,每个客户端有一个客户端连接。

例如,假设你有 2 个应用程序服务器,并在代码中定义了 5 个中心。 服务器连接计数是 50:(2 个应用服务器 * 5 个中心 * 每个中心的 5 个连接)。

Azure 门户中显示的连接计数包括服务器、客户端、诊断和实时跟踪连接。 连接类型在以下列表中定义:

  • 服务器连接:连接 Azure SignalR 服务和应用服务器。
  • 客户端连接:连接 Azure SignalR 服务和客户端应用。
  • 诊断连接:一种特殊类型的客户端连接,可生成更详细的日志,这可能会影响性能。 此类客户端旨在进行故障排除。
  • 实时跟踪连接:连接到实时跟踪终结点,并接收 Azure SignalR 服务的实时跟踪。

实时跟踪连接不算作客户端连接或服务器连接。

ASP.NET SignalR 在计算服务器连接数方面有所不同。 除了定义的中心以外,它还包括一个默认的中心。 默认情况下,每个应用程序服务器需要 5 个额外的初始服务器连接。 默认中心的初始连接计数与其他中心保持一致。

服务和应用程序服务器将保持同步连接状态,并对服务器连接进行调整,以获得更好的性能和服务稳定性。 因此你可能发现,正在运行的服务中的服务器连接数有变化。