【问题标题】:Feasibility of pushing notifications from web application to desktop windows forms application using SignalR使用 SignalR 将通知从 Web 应用程序推送到桌面 Windows 窗体应用程序的可行性
【发布时间】:2016-04-10 10:11:16
【问题描述】:

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

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

如果已连接,我希望桌面应用程序能够接收通知,如果没有连接,它将不会收到任何信息。如果应用程序未连接或未运行,我不想保存来自服务器的通知。推送的通知将是即时的,不会保存在客户端,它们只会显示。

我还有一个担心:如果多个用户同时连接并从服务器请求,这会影响服务器的性能吗?

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

SignalR 是否支持这种情况?

【问题讨论】:

  • 您是否尝试并为您的场景(20.000 个用户,ASP.NET 推送到 WinForms)获得了高性能的最终解决方案?你想分享 好的模式和实践吗?

标签: c# asp.net winforms notifications signalr


【解决方案1】:

SignalR 是否支持这种情况?

是的,它支持并且适用于实时通知。

您可以使用groups 将消息广播到指定的已连​​接客户端子集。但不要将组用于有意义的数据。

您可以track/map 连接的客户端,只需通过 connectionId/connectionIds 向特定用户/用户通知发送消息。

如果我们谈到性能,20000 个并发连接(我假设是并发的)确实很多。首先你应该 change IIS configuration 支持超过 5000 个并发请求。

你应该optimize signalr for performance。消息大小应该更小。每条消息应最大为 4 Kb(对于这么多的并发连接,我建议您使用更少)。

Signalr 使用Json,因此您可以使用JsonProperty 来减小消息大小。

[JsonProperty("op")]
public decimal OrderPrice

为什么邮件大小很重要?因为每个连接在服务器端都有一个缓冲区。如果客户端可以获得 1 条消息,但此时服务器发送了 2 条消息,则消息将被填充到缓冲区中。这些缓冲区使用内存。因此,您应该更加小心地处理 20000 个并发连接。否则你将遭受内存消耗。

但在你的情况下,消息大小是不够的,你应该减少这个缓冲区限制。

DefaultMessageBufferSize:默认情况下,SignalR 保留 1000 条消息 每个集线器每个连接的内存。如果正在使用大消息,这 可能会产生内存问题,可以通过减少这种情况来缓解 价值。可以在 Application_Start 事件处理程序中设置此设置 在 ASP.NET 应用程序中,或在 OWIN 的配置方法中 自托管应用程序中的启动类。以下示例 演示如何减少此值以减少内存 应用程序的占用空间,以减少服务器的数量 使用的内存:

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 个。每个服务器将有 5000 个并发请求(平均)。当您在服务器上发送一条消息时,其他服务器(也是它们的客户端)将通过背板获取消息。有什么缺点?您应该使用共享资源(例如:数据库)来跟踪/映射具有 connectionIds 的用户。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多