1

我在硬件防火墙后面有 2 个 Web 服务器 (IIS 8.5),我们的应用程序使用 SignalR 进行一些实时更新。我们使用 SQL Server 作为背板来帮助我们在这个负载平衡的环境中工作。此外,我们在负载均衡器上使用粘性会话来帮助我们在会话期间将用户保持在同一 Web 服务器上。当我们在这种硬件配置中运行时,我们会丢失至少 1/3 的消息。有时我们会收到所有预期的信息,但更多时候我们会错过很多信息。

当我们在单个 Web 服务器上运行时,所有消息都会被接收。有人对解决此问题有任何建议吗?我们已经打开了日志(客户端和服务器),看起来没有任何东西丢失或损坏。我们真的很难过。

编辑 - -

我希望一些额外的细节可以说明情况。

  • 服务器到客户端的消息正在丢失。几乎我们所有的通信都是服务器到客户端。
  • 我们仅使用基于 IP 的粘性会话,并且限制为 5 分钟,但我们会在 5 分钟内丢失消息。
  • 这是一些旧的 SignalR 代码,自 SignalR 1(甚至更早版本)以来仅被最低限度地触及。 我们在内存中保留了用户列表以及他们的连接,我们使用该列表将通知发送回客户端。这似乎很可能是问题的原因,但是对于粘性会话,用户应该至少在同一台服务器上停留 5 分钟,对吗?
  • 此用户列表将用户名映射到连接 ID。当我们的后端服务(在另一台机器上)用用户名而不是连接 ID 发送回消息时,这很有用。
4

2 回答 2

3

终于解决了这个问题。真的有2个问题。首先是我们在上面的编辑中使用了内存中的用户列表。一旦我们意识到这不会跨机器工作,我们就将其删除。这也将我们引向了第二个问题,即 SignalR 2 如何IUserIdProvider使用

Clients.User(userId).send(message)

代替

context.Clients.Client(connection)

自从我们多年前第一次开始使用 SignalR 以来,此代码就已经存在,并且在我们升级 SignalR 版本时从未得到正确更新

于 2017-11-01T10:27:21.330 回答
0

在两台服务器上的 web.config 中指定相同的machineKey 。

于 2017-10-30T10:46:01.990 回答