首页 > 解决方案 > 带有 Redis 横向扩展/背板的 ASP.NET SignalR 导致服务器负载线性增加

问题描述

我在两个不同的 Windows 服务器上运行 ASP.NET Web 应用程序 (.NET Framework 4.7.1)。每个应用程序实例都有一个 SignalR 消息服务器,其中包含用于不同类型消息的九个不同集线器。当两台服务器都在线时,会使用 Redis 背板进行 SignalR 横向扩展。

使用

任何一台服务器单独运行时都没有问题(无背板);但是,当两台服务器一起运行时,Redis 中的数据量不断增加,每台服务器使用的内存量不断增长,直到某些应用程序停止工作或客户端接收消息出现明显延迟。这可能需要一天到一周的时间。

设置

日志中没有异常或错误,我无法在另一个环境中重现该问题,包括使用大量客户端和消息进行负载测试。

查看 SignalR Redis 消息,我注意到有些消息被重复多次。查看代理日志,我注意到即使在一台服务器运行的情况下也有连续的 SignalRabort和消息。negotiate当记录客户端连接和断开连接时,有时对于ConnectionId相同的集线器会有重复的连接。

Redis 的网络配置文件。Falls 是应用程序池回收的时候。

服务器开始出现问题之前的内存。SignalR 占据了大部分。

编辑 1:我对两台服务器进行了大约一个小时的 SignalR 跟踪。 bus.log.txt在应用程序池被回收之前是干净的,没有例外。 transports.log.txt在两台服务器上的日志中都有多个异常。

SignalR.Transports.WebSocketTransport Error: 0 : OnError(7824eb1d-5916-4295-afe2-632fc8c01130, System.Net.WebSockets.WebSocketException (0x80070026): Reached the end of the file
SignalR.Transports.WebSocketTransport Error: 0 : OnError(d8f299ca-d658-40e8-af83-ba4bbc0166f2, System.Net.WebSockets.WebSocketException (0x800703E3): The I/O operation has been aborted because of either a thread exit or an application request

更新: 根据 SignalR 开发团队的说法,异常是正常的,不是我的问题的原因。

标签: c#asp.netredissignalrsignalr-backplane

解决方案


推荐阅读