【问题标题】:ASP.net web app, push notification to browser by creating a serviceASP.net Web 应用程序,通过创建服务向浏览器推送通知
【发布时间】: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


【解决方案1】:

我也有类似的情况:

在我的应用程序中,我有很多客户端,每个客户端都可以登录多次。例如客户端A和B,客户端A1使用PC桌面浏览器登录,同时使用Android手机登录(我们称之为A2)。客户端B2使用iPhone登录,客户端B1电脑桌面浏览器离线。

那么,当 A1 向 B 发送消息时(不知道 B1 或 B2):

  1. A1调用IIS中的Web Services或webapi发送消息,并将消息存储在sql中。

  2. A1调用signalr Server,告诉Server有一条消息从A到B。

  3. signalr Server知道当前A1、A2、B2在线,所以Server调用A2、B2 signalr客户端更新客户端页面。

这里假设 A2 Android App。正在前台和B聊天,屏幕会更新到和A1同步。

这里假设 B2 iPhone App。在后台,会生成本地通知,并在收到signaler消息的同时更新隐藏屏幕,B点击通知时可以看到更新的消息。

  1. 一段时间后,当 B1 使用 pc 浏览器登录时,它会调用 webservices 或 webapi 来获取最新消息。

就是这样。我没有sql触发器,没有新消息时一切都是空闲的,除了信号器的心跳(仅在连接状态改变时发生)。

设计思路是我尝试将加载放在客户端,客户端可以尽早收到消息。

【讨论】:

  • 在横向扩展场景中,如何让服务器 A 上的客户端 A1 在没有 signalR 服务器的情况下与服务器 B 上的客户端 B1 通信。将 signalR 包含在您的应用程序中而不是另一台服务器中。你的例子很棒我只是想知道如何实现这个特定的场景,因为我真的在考虑使用 signalR 来减轻头痛。但是,如果我确实使用它,我需要处理这种情况。我看到了一个开发人员 Power Point,他说一台服务器使用保存到数据库的客户端连接信息发布到另一台服务器。这是如何实现的?
  • 如果您将我的示例中的信号器服务器视为服务器 X,我的 web 服务实际上在服务器 Y 中,而我的 ms sql 服务器在服务器 Z 中。在我的情况下,服务器 X 可以通过以下方式调用服务器 Y 的函数网络服务或 webapi。如果你想让 Server Y 访问 Server X(在我的情况下我不需要这样做),你需要在 Server X 中添加一个控制台或 Winform signalr 客户端,并在 Server Y 中添加一个 signalr Server。
  • channel9.msdn.com/Events/Build/2013/3-502 如果您快进到 56:30,则几乎没有使用该场景的示例,如果我选择使用 singalR 添加更多功能,这将是最好的场景然后最终向外扩展。这个想法是根据用户连接到的服务器发布到不同的 http 端点。看看它的表现会很有趣。
猜你喜欢
  • 1970-01-01
  • 2018-04-27
  • 2015-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 1970-01-01
相关资源
最近更新 更多