我想在Web应用程序和桌面Winforms应用程序之间构建一个通知系统。
我希望我的Web应用程序将通知推送到Windows Forms Desktop应用程序中,同时我希望过滤将传递给用户的消息。我的意思是并非所有连接的用户都会收到所有消息。服务器端(Web应用程序)将进行过滤过程,以确定谁将收到什么。
我希望桌面应用程序接收通知(如果已连接),否则将什么也不会接收。如果应用未连接或未运行,我不想保存来自服务器的通知。推送通知将是即时的,不会保存在客户端,它们只会显示。
我还担心:如果连接了多个用户并同时从服务器请求,这会影响服务器的性能吗?
例如,将有20,000个用户使用Windows窗体应用程序从服务器端(Web应用程序)接收通知,具体取决于通知的类别。
SignalR是否支持这种情况?
SignalR是否支持这种情况?
是的,它支持并且适用于实时通知。
您可以使用组将消息广播到已连接客户端的指定子集。但不要将组用于敏感数据。
您可以跟踪/映射已连接的客户端,并仅通过connectionId / connectionIds将消息发送给特定的用户通知。
如果要提高性能,那么20000个并发连接(我假设是并发的)的确很多。首先,您应该更改IIS配置以支持5000多个并发请求。
您应该优化信号器的性能。邮件大小应较小。每条消息的最大长度应为4 Kb(我建议您对这么多并发连接使用更少的消息)。
Signalr的用途,Json
因此您可以JsonProperty
用来减小邮件大小。
[JsonProperty("op")]
public decimal OrderPrice
为什么邮件大小很重要?因为每个连接在服务器端都有一个缓冲区。如果客户端可以收到1条消息,但此时服务器发送2条消息,则消息将填充到缓冲区中。这些缓冲区使用内存。因此,您应该更小心地使用20000个并发连接。否则您将遭受内存消耗。
但是在您的刺激中,消息大小将不够,您还应该降低此bufffer限制。
DefaultMessageBufferSize:默认情况下,SignalR在每个集线器每个连接的内存中保留1000条消息。如果使用大消息,则可能会产生内存问题,可以通过减小此值来缓解此问题。可以在ASP.NET应用程序的Application_Start事件处理程序中,或者在自托管应用程序的OWIN启动类的Configuration方法中设置此设置。下面的示例演示如何减少此值,以减少应用程序的内存占用,以减少所使用的服务器内存量:
public class Startup { public void Configuration(IAppBuilder app) { // Any connection or hub wire up and configuration should go here GlobalHost.Configuration.DefaultMessageBufferSize = 500; app.MapSignalR(); } }
我建议您使用它100。减小缓冲区限制有什么缺点?当缓冲区已满时,它将不会得到任何新的消息。这意味着客户将丢失一些通知。因此,如果您的通知是事务性的(用户必须接收),则不要将缓冲区大小减少很多。但是,如果不能,则可以减小(最小值必须为32)。
您应在服务器端和客户端均使用net 4.5或更高版本,并且您的客户端应具有Windows8或更高版本以支持websocket。
应用这些步骤后,请遵循您的内存消耗并更改消息大小/缓冲区限制/消息的频率。
奖励: 20000个并发请求太多。因此,如果您遇到性能问题,建议您使用负载平衡器/扩展和Signalr BackPlane。这样,您将没有1个Web服务器,比方说4个。每个Web服务器平均有5000个并发请求。当您在服务器上发送一条消息时,其他服务器(以及它们的客户端)将通过背板获得该消息。有什么缺点?您应该使用共享资源(例如:数据库)来跟踪/映射具有connectionIds的用户。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句