我想在Web应用程序和桌面Winforms应用程序之间构建一个通知系统.
我希望我的Web应用程序将通知推送到我的Windows Forms桌面应用程序,同时我想过滤将传递给用户的消息.我的意思是并非所有连接用户都会收到所有消息.将在服务器端(Web应用程序)上发生过滤过程,以确定谁将收到什么.
我希望桌面应用程序在已经连接时接收通知,如果没有,它将不会收到任何通知.如果应用未连接或未运行,我不想保存来自服务器的通知.推送通知将是即时的,不会保存在客户端,它们将只显示.
另外我还有一个问题:如果多个用户连接并且同时从服务器请求,是否会影响服务器的性能?
例如,将有20,000个用户使用Windows窗体应用程序根据服务器端的类别(Web应用程序)接收通知.
SignalR是否支持这种情况?
解决方法:
Does SignalR supports this scenario?
是的它支持,它适用于实时通知.
您可以使用groups将消息广播到指定的已连接客户端子集.但是不要将组用于感性数据.
您可以通过connectionId / connectionIds将track/map连接的客户端发送到特定用户/用户通知.
如果我们来到性能,20000个并发连接(我同意并发)它真的很多.首先,您应该change IIS configuration支持超过5000个并发请求.
你应该optimize signalr for performance.邮件大小应该更少.每条消息应该最大4 Kb(我建议你使用更少的并发连接).
Signalr使用Json,因此您可以使用JsonProperty来减少消息大小.
[JsonProperty("op")]
public decimal OrderPrice
为什么邮件大小很重要?因为每个连接在服务器端都有一个缓冲区.如果客户端可以获得1个消息,但在那时服务器发送2条消息,消息将填充在缓冲区中.这些缓冲区使用内存.因此,您应该更加谨慎地使用20000个并发连接.否则你会遭受内存消耗.
但是在你的煽动中,消息大小还不够,你应该减少这个bufffer限制.
DefaultMessageBufferSize: By default, SignalR retains 1000 messages in
memory per hub per connection. If large messages are being used, this
may create memory issues which can be alleviated by reducing this
value. This setting can be set in the Application_Start event handler
in an ASP.NET application, or in the Configuration method of an OWIN
startup class in a self-hosted application. The following sample
demonstrates how to reduce this value in order to reduce the memory
footprint of your application in order to reduce the amount of server
memory used:06001
我建议你使用它100.降低缓冲限制有什么缺点?当缓冲区已满时,它不会得到任何新的消息.这意味着客户端会丢失一些通知.因此,如果您的通知是事务性的(用户必须接收),请不要减少许多缓冲区大小.但如果没有,你可以减少(Minumum必须是32).
您应该在服务器端和客户端使用net 4.5或更高版本,并且您的客户端应该具有windows8或更高版本以支持websocket.
应用这些步骤后,请关注您的内存消耗并更改消息大小/缓冲区限制/消息频率.
额外奖励:20000个并发请求太多.因此,我建议您使用负载均衡器/ scaleup和Signalr BackPlane,如果您遇到性能问题.这样,你就不会有1个网络服务器让我们说4.每个将有5000个并发请求(平均).当您在服务器上发送一条消息时,其他服务器(也是其客户端)将收到带有背板的消息.有什么缺点?您应该使用共享资源(例如:数据库)来跟踪/映射具有connectionIds的用户.