【发布时间】:2015-06-18 00:05:57
【问题描述】:
Web 应用程序 Asp.net 和 C#
我正在开发一个 Web 应用程序,理想情况下该应用程序将包括通知服务,当用户在浏览器上收到兴趣或类似内容时更新用户。
理论
例如,用户 1 为用户 2 点了赞,用户 2 的信息被传递到我的 Web 应用程序中进行处理。如果我想在在线/离线时更新用户 2,我需要一个异步处理的进程。当用户 2 登录时,我的应用程序必须检查是否有任何更新和推送,并在用户打开时继续检查。我看到它的方式是,我需要为每个访问我的应用程序的用户指定一个任务,以检查该用户是否有任何更新。如果没有任何更新,该任务将被锁定等待更新。已经有并发连接在等待该任务,因此消耗量是原来的 2 倍。
问题
我正在尝试找出另一种分配负载的方法,以便我的应用程序可以通过与其他系统或服务通信来优雅地处理推送。由于为每个具有并发连接的用户专门分配一个工作任务会占用大量资源。
研究至今
我研究了一个消息队列系统,看看这是否能解决问题,但在研究时,我似乎会做同样的事情,就像专门处理一个任务来处理每个访问我的应用程序的用户来收听任何消息从队列中。
或者更糟糕的是,我必须为每个用户创建唯一的队列,这是不推荐的,然后处理消息并为用户是否在线/离线添加更多逻辑。
问题
检查更新的最有效方式是什么,是我上面描述的方式,为每个使用我的 Web 应用程序的用户指定一个任务,还是有另一种设计模式可以用来为我的那部分提供服务?申请?
我想说的一点
使用 signalr 等框架或 commet 或 long polling 等方法将客户端连接到我的 Web 应用程序没有问题。
我使用了带有 SQLdependancy 的 signalR,但存在性能问题。我不能使用 SQL Server 来触发事件,因为如果用户数量增加,它会锁定我服务器上的一个线程,因为每个依赖于 SQL 创建的集线器都会调用 asych/await。从理论上讲,我真的很想将其作为服务复制到我的应用程序中,但不知道如何做到这一点。
【问题讨论】:
-
我认为您可能会在没有真正分析当前设置的情况下仅根据您阅读的内容对 SignalR 进行打折。见github.com/SignalR/SignalR/wiki/Performance。此外,我可以将其视为已结束,因为问题要么过于宽泛,要么主要基于意见。
-
我看不出它是如何基于意见的我清楚地询问推送通知如何在内部使用 .net 框架上的服务工作。正如我最后所说,我不会为将浏览器/客户端连接到我的 Web 应用程序而苦苦挣扎,SignalR 很棒,但单独它并不能解决我的问题。当用户未连接时,SignalR 如何区分将哪些通知推送给谁?我需要编写独特的有效载荷,更新也存储独特的信息。 SignalR 只是一个沟通渠道,它不能解决我的应用程序如何获得服务的问题。
-
只是总结一下我喜欢 signalR,我绝不是说它本身就是一个性能瓶颈,你可以扩展它并用它做一些很棒的事情。我只是说这是 SQLdependancy 和 sql 作为服务代理的性能问题。 SQL 服务器的性能问题,而不是我的应用程序。做了大量研究,以这种方式将任何信息推送到应用程序或客户端确实不是一个好主意。在寻找替代方法的同时,越来越难以找到一种好的方法来解决我在将更新推送到我的网络应用程序时遇到的问题,而不会造成破坏。
标签: c# .net multithreading web-services push-notification