【发布时间】: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