【问题标题】:Using SqlCacheDependency to get real time updates? - ASP.NET使用 SqlCacheDependency 获取实时更新? - ASP.NET
【发布时间】:2010-01-09 14:01:02
【问题描述】:

我想在网页上显示实时更新(基于被外部进程更改的数据库表中的状态字段)。根据我的研究,有几种方法可以做到这一点。

  • 长轮询(彗星) - 这似乎很难实现
  • 定期轮询 - 我可以让 AJAX 方法每 5 秒触发一次数据库命中以获取当前状态。但我担心这会产生性能问题。

然后我阅读了有关使用 SqlCacheDependency 的信息 - 基本上缓存会根据表中的字段而失效。我假设我可以使用缓存失效时触发的事件向用户显示新的更新?

什么是不会出现性能问题的简单解决方案?

【问题讨论】:

    标签: .net asp.net polling long-polling


    【解决方案1】:

    与轮询数据库不同,一种更具可扩展性和性能的方法是轮询 Web 服务器上是否存在文件,类似于轻量级 js 文件。 文件的内容并不重要,但为了让您了解,您可以拥有某种 JSON 对象,该对象更详细地描述了该过程的结果。

    然后,作为最后一步执行处理的后台进程可以创建文件或调用 Web 层上的 Web 服务来执行此操作。

    这是它的工作原理。

    用户按下发布到服务器的按钮

    服务器启动进程并返回一个标识符,例如C3201620-E622-4fe2-9F3A-E02FFA613F59

    Web UI 然后定期轮询是否存在 C3201620-E622-4fe2-9F3A-E02FFA613F59.js,javascript 将管理 404 错误并继续重试,直到收到 200

    希望这能给你一些想法。

    在 jQuery 中处理 404 的代码示例

    $.ajax({
            url: '/CheckForStatusChange/C3201620-E622-4fe2-9F3A-E02FFA613F59.json',
            type: "GET",
            success: function(result) {
    
            },
            error: function(request, status, error) {
            //handle error here and setTimeOut                 
    
            }); 
    

    【讨论】:

    • 性能方面 - 为什么你觉得 WebUI 轮询文件是否存在比轮询数据库更好?
    • 性能可能可以忽略不计,尽管提供静态文件总是比查询数据存储更快。关键区别在于可扩展性。 Web 服务器非常擅长提供静态文件,而且文件不一定必须存储在本地 Web 服务器上,而是您可以使用 CDN(内容交付网络),这样您就可以将所有轮询流量从您的核心网络服务器。
    【解决方案2】:

    您有 2 个问题:

    1. 检索要推送的数据
    2. 将数据推送到客户端

    第 1 项很简单,假设您有一个相当有效的查询,并且您不是为每个用户查询它;只需查询、获取数据并推送即可。您可以使用 SqlDependency 选项,也可以只轮询它;这取决于您的数据量。

    第 2 项有点棘手,因为您需要不断地访问服务器,或者使用彗星服务器。我们在 Frozen Mountain 编写了一个高度可扩展的 .NET comet 服务器WebSync,它可能符合要求。本质上,您有一个单独的流程来驱动发布,而 WebSync 将处理将数据推送到您的客户端。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-07
      • 1970-01-01
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 2021-03-22
      相关资源
      最近更新 更多