使用SignalR将通知从Web应用程序推送到桌面窗口应用程序的可行性

Lai*_*ila 5 c# asp.net notifications winforms signalr

我想在Web应用程序和桌面Winforms应用程序之间构建一个通知系统.

我希望我的Web应用程序将通知推送到我的Windows Forms桌面应用程序,同时我想过滤将传递给用户的消息.我的意思是并非所有连接用户都会收到所有消息.将在服务器端(Web应用程序)上发生过滤过程,以确定谁将收到什么.

我希望桌面应用程序在已经连接的情况下接收通知,否则它将不会收到任何通知.如果应用未连接或未运行,我不想保存来自服务器的通知.推送通知将是即时的,不会保存在客户端,它们将只显示.

另外我还有一个问题:如果多个用户连接并且同时从服务器请求,是否会影响服务器的性能?

例如,将有20,000个用户使用Windows窗体应用程序根据服务器端的类别(Web应用程序)接收通知.

SignalR是否支持这种情况?

Erk*_*rel 5

SignalR是否支持这种情况?

是的它支持,它适用于实时通知.

您可以使用将消息广播到已连接客户端的指定子集.但是不要将组用于感性数据.

您可以跟踪/映射已连接的客户端,只需通过connectionId/connectionIds向特定用户/用户通知发送消息.

如果我们来到性能,20000个并发连接(我同意并发)它真的很多.首先,您应该更改IIS配置以支持超过5000个并发请求.

您应该优化信号器的性能.邮件大小应该更少.每条消息应该最大4 Kb(我建议你使用更少的并发连接).

信号器使用,Json因此您可以使用JsonProperty减少消息大小.

[JsonProperty("op")]
public decimal OrderPrice
Run Code Online (Sandbox Code Playgroud)

为什么邮件大小很重要?因为每个连接在服务器端都有一个缓冲区.如果客户端可以获得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();
    }
}
Run Code Online (Sandbox Code Playgroud)

我建议你使用它100.降低缓冲限制有什么缺点?当缓冲区已满时,它不会得到任何新的消息.这意味着客户端会丢失一些通知.因此,如果您的通知是事务性的(用户必须接收),请不要减少许多缓冲区大小.但如果没有,你可以减少(Minumum必须是32).

您应该在服务器端和客户端使用net 4.5或更高版本,并且您的客户端应该具有windows8或更高版本以支持websocket.

应用这些步骤后,请关注您的内存消耗并更改消息大小/缓冲区限制/消息频率.

额外奖励: 20000个并发请求太多.因此,我建议您使用负载平衡器/ scaleupSignalr BackPlane,如果您遇到性能问题.这样,你就不会有1个网络服务器让我们说4.每个将有5000个并发请求(平均).当您在服务器上发送一条消息时,其他服务器(也是其客户端)将收到带有背板的消息.有什么缺点?您应该使用共享资源(例如:数据库)来跟踪/映射具有connectionIds的用户.