ASP.net Web应用程序,通过创建服务将通知推送到浏览器

时间:2015-06-18 00:05:57

标签: c# .net multithreading web-services push-notification

Web应用程序Asp.net& C#

我正在开发一个理想情况下会包含通知服务的Web应用程序,在用户收到浏览器上的兴趣等时更新用户。

理论

例如,用户1点击用户2,用户2信息将传递到我的Web应用程序进行处理。如果我想在线/离线时更新用户2,我需要异步处理进程句柄。当用户2登录时,我的应用程序必须检查是否有任何更新并推送,并在用户打开时继续检查。我看到它的方式是我需要为访问我的应用程序的每个用户专门设置一个任务,以检查该用户是否有任何更新。如果没有任何更新,该任务将被锁定等待一个。已经存在等待该任务的并发连接,因此这是消耗的2倍。

问题

我试图找出另一种分配负载的方法,以便我的应用程序可以通过与其他系统或服务进行通信来优雅地处理推送。由于为每个用户提供并发连接的工作任务,因此资源太紧张。

到目前为止已研究

我查看了一个消息排队系统,看看是否可以解决这个问题,但是在研究它时,似乎我会做同样的事情,即专门处理访问我的应用程序的每个用户来监听任何消息从队列中。

或者更糟糕的是,我不得不为每个用户创建不推荐的唯一队列,然后处理该消息并为用户是否在线/离线添加更多逻辑。

问题

检查更新的最有效方法是什么,是我上面描述的方式,为每个用户专门为每个用户使用我的Web应用程序,还是有另一种设计模式可以用来为我的那部分服务应用

我想做点

使用信号器等框架或commet或长轮询等方法将客户端连接到Web应用程序时,我不会遇到任何问题。

我将signalR与SQLdependancy一起使用,但性能存在问题。我不能使用SQL Server来触发事件,因为如果用户数量增加,它会锁定我的服务器上的一个线程,因为每个使用SQL依赖创建的集线器都会调用asych / await。从理论上讲,我真的希望将其作为一项服务复制到我的应用程序中,但我不知道如何解决这个问题。

1 个答案:

答案 0 :(得分:0)

我有类似的情况:

在我的应用程序中,我有很多客户端,每个客户端都可以多次登录。例如客户A& B,客户端A1使用PC桌面浏览器登录,同时使用Android手机登录(让我们称之为A2)。客户端B2使用iPhone登录,同一客户端B1 pc桌面浏览器处于脱机状态。

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

  1. A1在IIS中调用Web服务或webapi以发送消息并将消息存储在sql中。

  2. A1调用信号服务器,告诉服务器有从A到B的消息。

  3. signalr服务器知道当前A1,A2,B2在线,因此服务器调用A2和B2信号器客户端来更新客户端页面。

  4. 这里假设A2 Android App。在前台并与B聊天,屏幕将更新以与A1同步。

    这里假设是B2 iPhone App。在后台,将生成本地通知,并在收到信号器消息时更新隐藏屏幕,B可以在单击通知时看到更新的消息。

    1. 当B1使用pc浏览器登录一段时间后,它会调用webservices或webapi来获取最新消息。
    2. 就是这样。我没有sql触发器,当没有新消息时,一切都是空闲的,除了信号器的心跳(仅在连接状态改变时发生)。

      设计理念是我尝试在客户端加载,客户端尽可能早地接收消息。