SignalR与负载均衡器缺失消息相结合

时间:2017-10-30 02:30:30

标签: websocket signalr load-balancing signalr-backplane signalr-2

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

当我们在单个Web服务器上运行时,会收到所有消息。有没有人有任何解决这个问题的建议?我们打开了日志(客户端和服务器),看起来没有任何遗漏或损坏。我们真的很难过。

EDIT ---

我希望其他一些细节可以说明情况。

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

2 个答案:

答案 0 :(得分:2)

终于解决了这个问题。真的有2个问题。首先是我们使用上面编辑中提到的内存用户列表。一旦我们意识到不能跨机器工作,我们就将其删除了。它还引导我们进入第二个问题,即SignalR 2如何使用IUserIdProvider并且我们的调用应该是

Clients.User(userId).send(message)

而不是

context.Clients.Client(connection)

此代码自我们多年前首次使用SignalR以来就已存在,并且在我们升级SignalR版本时从未得到适当的更新

答案 1 :(得分:0)

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