【发布时间】:2020-03-03 23:38:58
【问题描述】:
我目前正在尝试 SignalR 和 RabbitMQ 以循环/负载平衡 json web 服务查询,并且在处理大型 (~ 300 - 2500 kb) 消息时,我遇到了其中一个应用程序的内存消耗问题.
我有一个 IIS 服务器托管一个 web 应用程序(名为“后端”),该应用程序需要查询另一个同样由 IIS 服务器托管的 web 应用程序(名称为“定价”)。 为了保持与我的 RabbitMQ 服务器的连接,我开发了使用 SignalR 连接到后端和定价的控制台应用程序。
因此,当后端需要查询 Pricing 时,它会要求其控制台在队列中发布消息,并且附加到 Pricing 的控制台获取消息并将其提供给 Pricing(使用 Invoke 方法)。当 Pricing 完成其工作时,它要求其控制台发布回复消息,并且附加到后端的控制台将其接收并提供给后端。
总结一下: [后端] -> [控制台] -> [RabbitMQ]
我有 2 个定价从他们的控制台从 RabbitMQ 队列中获取消息。
此设置是为了替换 2 个 IIS 之间的传统 Web 服务查询,并受益于 RabbitMQ(负载平衡器和微/Web 服务架构中的异步调用)的优势
我加了
GlobalHost.Configuration.MaxIncomingWebSocketMessageSize = null;
在两个 IIS 中的 Startup.cs 中以便接受大消息。
当我在 Windows 任务管理器中查看定价的内存消耗时,它迅速从 500Mb 增长到 1500Mb(在 5 分钟内,处理来自后端的无休止查询以测试设置)。
我通过将查询内容写入共享文件夹中的文件并仅在 RabbitMQ 的消息中发布文件的名称以及定价的内存消耗(当然需要修改代码以加载文件)来尝试其他方法移动并保持在 500Mb 左右。
所以它似乎与我的控制台传递给 IIS 的消息长度有关。
我试图断开控制台与 IIS 集线器的连接,因为我认为它可能会释放一些内存,但没有。
有没有人遇到过大型消息进入集线器的内存消耗问题?如何检查我的应用程序中是否确实存在内存泄漏?
在 Web/微服务环境中使用 SignalR 和 RabbitMQ 怎么样?有什么反馈吗?
非常感谢,
让-弗朗索瓦
.NETFramework : 4.5
Microsoft.AspNet.SignalR : 2.4.1
【问题讨论】:
-
请使用内存分析器来实际检查内存使用情况。这可以很容易地说明可能出了什么问题。
-
感谢您的回复。我发现我可以限制保存在集线器中的消息数量,这似乎可以减少内存。