【问题标题】:Saving SignalR connection state with scaleout servers使用横向扩展服务器保存 SignalR 连接状态
【发布时间】:2016-10-02 11:50:42
【问题描述】:

使用 SignalR 2.2.0,我想验证有关在多服务器横向扩展设置中执行集线器方法的客户端的观察结果。

我使用 SQL Server 横向扩展消息总线在多服务器模型中运行 SignalR。

当客户端连接时,会调用 Hub 的 OnConnected 方法,正如预期的那样。我将Context.ConnectionId 保存在静态字典中。

当客户端稍后调用集线器的方法时,似乎场中的另一台服务器正在执行集线器方法,而不是最初运行 OnConnected 方法的服务器。 hub方法中的Context.ConnectionId值是正确的,但字典中不存在。

这是横向扩展模型中的预期行为吗?如果是这样,那么我假设我应该将连接状态数据保存在数据库中,以便所有服务器上的所有 Hub 都能够根据 ConnectionId 查找连接状态。

【问题讨论】:

  • 通常,将共享信息存储在共享数据库中是使用横向扩展模型的一种方式。但是我不明白你为什么需要存储连接状态,signalR 中的服务器应该只关心它的local 状态,这个信息不需要共享。我们所需要的只是一个在服务器之间传输消息的底板。您是否有任何具体要求需要分享这些信息?
  • 假设我们有 3 个用户 (1,2,3) 连接到 server1,3 个用户 (4,5,6) 连接到 server2。当用户 4 向用户 1 发送消息时,消息来自用户 4 => 服务器 2 => 背板 => 服务器 1 => 用户 1。如果用户 1 连接到两个服务器(在不同设备上),这也适用,在这种情况下,server1 和 server2 都以不同的连接 ID 响应用户 1,代表不同的设备或不同的浏览器选项卡,......没有任何问题。

标签: c# asp.net signalr signalr-hub signalr-backplane


【解决方案1】:

这是横向扩展模型中的预期行为吗?如果是这样,那么我 假设我应该将连接状态数据保存在数据库中,所以 所有服务器上的所有集线器都可以查找连接 基于 ConnectionId 的状态。

是的,这是预期的行为,您应该使用数据库或缓存等共享资源。但是 connectionIds 本身是不够的。因为客户端会在不同的服务器上或刷新时获得不同的 connectionId。所以你应该映射connectionId和client。当发生断开连接时,找到带有 connectionId 的客户端并检查此客户端是否有另一个 connectionId。

here我已经根据问题回答了更多细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-26
    • 1970-01-01
    • 1970-01-01
    • 2013-11-02
    • 1970-01-01
    • 1970-01-01
    • 2013-01-19
    • 2023-04-10
    相关资源
    最近更新 更多