【发布时间】:2018-04-10 23:13:10
【问题描述】:
我在硬件防火墙后面有 2 个 Web 服务器 (IIS 8.5),我们的应用程序使用 SignalR 进行一些实时更新。我们使用 SQL Server 作为背板来帮助我们在这个负载平衡的环境中工作。此外,我们在负载均衡器上使用粘性会话来帮助我们在会话期间将用户保持在同一 Web 服务器上。当我们在这种硬件配置中运行时,我们会丢失至少 1/3 的消息。有时我们会收到所有预期的信息,但更多时候我们会错过很多信息。
当我们在单个 Web 服务器上运行时,所有消息都会被接收。有人对解决此问题有任何建议吗?我们已经打开了日志(客户端和服务器),看起来没有任何东西丢失或损坏。我们真的很难过。
编辑---
我希望能提供一些额外的细节来说明情况。
- 服务器到客户端的消息正在丢失。几乎我们所有的通信都是服务器到客户端。
- 我们正在使用仅基于 IP 的粘性会话,并且限制为 5 分钟,但我们会在 5 分钟内丢失消息。
- 这是一些旧的 SignalR 代码,自 SignalR 1(甚至更早版本)以来,它只被最低限度地触及。 我们在内存中保留了用户列表及其连接,我们使用该列表将通知发送回客户端。这似乎很可能是问题的原因,但使用粘性会话用户应该至少在同一台服务器上停留 5 分钟,对吧?
- 此用户列表将用户名映射到连接 ID。当我们的后端服务(在另一台机器上)使用用户名而不是连接 ID 发送回消息时,这很有用。
【问题讨论】:
-
您能否尝试将此用户列表保存在分布式内存中,如果不是为了好,至少可以缩小问题范围。由于您已经拥有用于 signalr 的 sql server,您可以在 sql server 中支持您的会话,如果列表不太大,则将列表保留在那里。或者,您可以考虑使用像 memcached 或 redis 这样的分布式缓存(或者如果太多,那么只需存储在您自己的数据库表中)
标签: websocket signalr load-balancing signalr-backplane signalr-2