Websocket 与负载平衡器组合的信号器丢失消息

Websocket 与负载平衡器组合的信号器丢失消息,websocket,signalr,load-balancing,signalr-backplane,signalr-2,Websocket,Signalr,Load Balancing,Signalr Backplane,Signalr 2,我在硬件防火墙后面有两台web服务器(IIS 8.5),我们的应用程序使用Signal进行一些实时更新。我们使用SQL Server作为底板,以帮助我们在这种负载平衡的环境中工作。此外,我们在负载平衡器上使用粘性会话来帮助用户在会话期间保持在同一个web服务器上。当我们在这种硬件配置下运行时,至少会丢失1/3的消息。有时候,我们得到了所有预期的信息,但更多的时候,我们错过了很多 当我们在单个web服务器上运行时,所有消息都会被接收。有人对解决这个问题有什么建议吗?我们已经打开了日志(客户端和服务

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

当我们在单个web服务器上运行时,所有消息都会被接收。有人对解决这个问题有什么建议吗?我们已经打开了日志(客户端和服务器),但没有任何日志丢失或损坏。我们真的被难住了

编辑---

我希望一些额外的细节将有助于了解情况

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

在两台服务器的web.config中指定了相同的设置。

最终解决了这个问题。实际上有两个问题。首先,我们使用的是内存中的用户列表,如上面的编辑中所述。一旦我们意识到这在机器上是行不通的,我们就把它拆了。这也引出了第二个问题,即信号器2如何使用
IUserIdProvider
,我们的呼叫应该是

Clients.User(userId).send(message)
而不是

context.Clients.Client(connection)

这段代码在我们多年前第一次使用SignalR时就已经存在,并且在升级SignalR版本时从未得到适当更新。这没什么区别。在我们以前的环境中,我们使用ARR作为负载平衡器,并且必须进行更改。以前的环境与硬件负载平衡器更加一致,现在我们看到的是不断丢弃的消息。@Steven我在硬件负载平衡器后面使用Signalr,还有sql背板。我也在使用粘性会话。丢失的是客户端到客户端、客户端到服务器还是服务器到客户端的消息?我用一些其他详细信息更新了问题。您是否可以尝试将此用户列表保存在分布式内存中,如果不是永久的,至少可以缩小问题的范围。由于您已经有了sql server for Signal,您可以在sql server中备份会话,如果列表不太大,可以将其保留在那里。或者,您可以考虑使用分布式缓存,如memcached或redis(或者如果太多,则只需存储在您自己的db表中),谢谢,我刚才这么做了。非常感谢你的帮助。