【问题标题】:How to perform server side DB polling in ASP.Net?如何在 ASP.Net 中执行服务器端 DB 轮询?
【发布时间】:2014-09-11 04:06:41
【问题描述】:

我有一个在 angular.js、WebAPI 和 mongodb 上运行的应用程序。我的目标是用信号器替换客户端轮询。由于 mongodb 不会在更改时触发事件,因此我仍然需要在服务器端进行轮询,如果我检测到更改,请使用信号集线器对其进行广播。

是否有可靠的方法来做到这一点,而不会破坏 IIS 的重复任务?

我尝试了什么:

  1. Hangfire:似乎是推荐的解决方案,但目前仅支持 SQL Server 和 redis(不是选项)。
  2. HostingEnvironment.QueueBackgroundWorkItem:可能有效,但我担心它没有被广泛使用,我可能会错过一些陷阱。
  3. 有一种方法可以使用“上限集合上的可尾光标”从 mongo 获取事件 - 不是一种选择

【问题讨论】:

  • 我对这类问题的标准回答,当你在 DB 中改变状态时,你不能发出一个事件信号吗?
  • @Anders - 不。另一个(非 Web)组件正在更改数据库。该组件与 API 之间不能直接连接。
  • 您不能使用服务总线吗?这样,“组件”只发布消息,Web 服务器订阅它们。
  • 没有。还有其他一些问题限制了 Web 应用程序只能与 DB 通信。如果可以的话,我们会的,而且我不会费心问这个问题......
  • 让多个系统访问同一个数据库是不好的做法,但它就是这样

标签: c# asp.net angularjs mongodb signalr


【解决方案1】:

答案一如既往:“视情况而定”。

  • HostingEnvironment.QueueBackgroundWorkItem。 .NET 4.5.2 中的最新添加。不保证执行,见post末尾的限制:

  • WebBackgrounder。来自 Scott Hanselman blog 的引述:“它的代码多年来没有被触及,但 WebBackgrounder NuGet 包已被下载近 50 万次”。

  • 吊火。流行的开源项目,添加 mongodb 支持总是一个受欢迎的 PR :)

  • 使用 RavenDb 代替 MongoDb。他们的Changes API 真的很酷。

第一个和第二个选项不保证作业执行,第三个和第四个选项依赖于数据存储。

【讨论】:

    【解决方案2】:

    考虑到我们上面讨论的内容,QueueBackgroundWorkItem 是您的最佳选择,但它不是 100% 防弹的。应用程序池仍将回收。您可以创建一个 Windows 服务,通知 Web 应用程序轮询数据库。

    无论如何,一旦您获得了信号(通过轮询或其他方式),您就可以从那时起使用事件驱动设计。好处是解耦域和可扩展性。我为此创建了这个框架。

    https://github.com/AndersMalmgren/SignalR.EventAggregatorProxy/wiki

    【讨论】:

    • 正如我所说,创建另一个服务不是一种选择。您的图书馆看起来不错,但与我的问题无关。除了不是 100% 防弹之外,您对 QBWI 有什么要评论的吗?应用程序池将始终回收 - 关键是如何正确处理。
    • 你还没有说过,但是好的。无论如何,使用 CancellationToken 您可以在应用程序回收之前安全地完成您的任务。
    • 这是一篇不错的博客,涵盖了在 ASP.NET 中进行后台工作的不同方法blog.stephencleary.com/2014/06/fire-and-forget-on-asp-net.html
    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 2014-11-24
    • 1970-01-01
    • 2013-11-13
    • 2020-04-16
    • 2023-01-16
    • 1970-01-01
    相关资源
    最近更新 更多