SignalR 结合负载均衡器丢失消息
SignalR combined with load balancer missing messages
我在硬件防火墙后面有 2 个 Web 服务器 (IIS 8.5),我们的应用程序使用 SignalR 进行一些实时更新。我们正在使用 SQL 服务器作为背板,以帮助我们在这种负载平衡环境中工作。此外,我们在负载均衡器上使用粘性会话来帮助我们在用户会话期间将用户保持在同一网络服务器上。当我们在这种硬件配置中 运行 时,我们至少会丢失 1/3 的消息。有时我们会收到所有预期的消息,但更多时候我们会错过很多消息。
当我们 运行 在单个网络服务器上时,所有消息都会收到。有人对解决此问题有任何建议吗?我们已经打开了日志(客户端和服务器),看起来没有任何东西丢失或损坏。我们真的很困惑。
编辑---
一些额外的细节,我希望能说明情况。
- 服务器到客户端的消息正在丢失。我们几乎所有的通信都是服务器到客户端。
- 我们正在使用仅基于 IP 的粘性会话并且限制为 5 分钟,但我们在这 5 分钟内丢失消息。
- 这是一些旧的 SignalR 代码,自 SignalR 1(或更早版本)以来只被极少触及。 我们在内存中保留了一个用户列表以及他们的连接,我们使用该列表将通知发送回客户端。这似乎很可能是问题的原因,但是粘性会话用户应该粘在同一台服务器上至少 5 分钟,对吗?
- 此用户列表将用户名映射到连接 ID。当我们的后端服务(在另一台机器上)使用用户名而不是连接 ID 发回消息时,这很有用。
在两台服务器上的 web.config 中指定相同的 machineKey。
终于解决了这个问题。确实有两个问题。首先是我们在上面的编辑中提到的使用内存中的用户列表。一旦我们意识到它不能跨机器工作,我们就将其删除。这也让我们想到了第二个问题,即 SignalR 2 如何使用 IUserIdProvider
而我们的调用应该是
Clients.User(userId).send(message)
而不是
context.Clients.Client(connection)
自从我们多年前开始使用 SignalR 以来,此代码就已经存在,并且在我们升级 SignalR 版本时从未得到正确更新
我在硬件防火墙后面有 2 个 Web 服务器 (IIS 8.5),我们的应用程序使用 SignalR 进行一些实时更新。我们正在使用 SQL 服务器作为背板,以帮助我们在这种负载平衡环境中工作。此外,我们在负载均衡器上使用粘性会话来帮助我们在用户会话期间将用户保持在同一网络服务器上。当我们在这种硬件配置中 运行 时,我们至少会丢失 1/3 的消息。有时我们会收到所有预期的消息,但更多时候我们会错过很多消息。
当我们 运行 在单个网络服务器上时,所有消息都会收到。有人对解决此问题有任何建议吗?我们已经打开了日志(客户端和服务器),看起来没有任何东西丢失或损坏。我们真的很困惑。
编辑---
一些额外的细节,我希望能说明情况。
- 服务器到客户端的消息正在丢失。我们几乎所有的通信都是服务器到客户端。
- 我们正在使用仅基于 IP 的粘性会话并且限制为 5 分钟,但我们在这 5 分钟内丢失消息。
- 这是一些旧的 SignalR 代码,自 SignalR 1(或更早版本)以来只被极少触及。 我们在内存中保留了一个用户列表以及他们的连接,我们使用该列表将通知发送回客户端。这似乎很可能是问题的原因,但是粘性会话用户应该粘在同一台服务器上至少 5 分钟,对吗?
- 此用户列表将用户名映射到连接 ID。当我们的后端服务(在另一台机器上)使用用户名而不是连接 ID 发回消息时,这很有用。
在两台服务器上的 web.config 中指定相同的 machineKey。
终于解决了这个问题。确实有两个问题。首先是我们在上面的编辑中提到的使用内存中的用户列表。一旦我们意识到它不能跨机器工作,我们就将其删除。这也让我们想到了第二个问题,即 SignalR 2 如何使用 IUserIdProvider
而我们的调用应该是
Clients.User(userId).send(message)
而不是
context.Clients.Client(connection)
自从我们多年前开始使用 SignalR 以来,此代码就已经存在,并且在我们升级 SignalR 版本时从未得到正确更新