我目前正在尝试SignalR和RabbitMQ,以便轮流/负载均衡json Web服务查询,并且在处理大型(〜300-2500 kb)消息时,应用程序之一的内存消耗存在问题。
我有一个IIS服务器托管一个Web应用程序(名为“后端”),该服务器需要查询另一个由IIS服务器托管的Web应用程序(名为“ Pricing”)。为了使与RabbitMQ服务器的连接保持活动状态,我开发了控制台应用程序,该应用程序使用SignalR连接到后端和Princing。
因此,当后端需要查询Princing时,它会要求其控制台在队列中发布消息,而附加到Pricing的控制台接收该消息并将其提供给Pricing(使用Invoke <>方法)。当Pricing完成其工作时,它要求其控制台发布答复消息,而附加到Backend的控制台将其接收并提供给Backend。
总结:[后端]-> [控制台]-> [RabbitMQ]
而且我有2个Pricing,从RabbitMQ队列中从其控制台获取消息。
此设置将替换2个IIS之间的传统Web服务查询,并受益于RabbitMQ的优势(微/ Web服务体系结构中的负载平衡器和异步调用)
我添加了
GlobalHost.Configuration.MaxIncomingWebSocketMessageSize = null;
在两个IIS的Startup.cs中,为了接受大消息。
[当我查看Windows Task Manager中Pricing的内存消耗时,它很快从500Mb增长到1500Mb(在5分钟内,处理来自Backend的无休止查询以测试设置)。
我尝试了其他方法,将查询内容写入共享文件夹中的文件,然后仅在RabbitMQ的消息中发布文件名,而Pricing的内存消耗(当然需要修改代码以加载文件)并保持在500Mb左右。
因此,这似乎与我的控制台传递给IIS的消息长度有关。
我试图断开控制台与IIS集线器的连接,因为我认为它可能会释放一些内存,但不会。
有人通过集线器中的大消息遇到过这个消耗内存的问题吗?如何检查我的应用程序中是否确实存在内存泄漏?
如何在Web /微服务环境中使用SignalR和RabbitMQ?有任何意见吗?
非常感谢,
Jean-Francois
.NETFramework : 4.5
Microsoft.AspNet.SignalR : 2.4.1
GlobalHost.Configuration.DefaultMessageBufferSize = 50;
其默认值为1000,这意味着(如果我清楚地理解的话),IIS在内存中保留了1000条消息的循环缓冲区。一些消息的权重为2.5Mo,这意味着每个连接使用的内存可能高达2500Mo。
由于我的IIS只有一个连接(它的控制台),并且不需要跟踪消息(因为它作为Web服务,所以似乎1000条消息太多了。
限制为50条消息,Windows Task Manager中的应用程序使用的内存将保持放置状态(大约500Mo)。
我的使用方式是否存在任何缺陷?
谢谢!