【问题标题】:Best Option for Queuing Status Updates .NET排队状态更新的最佳选择 .NET
【发布时间】:2013-05-27 20:58:25
【问题描述】:

我正在寻找一些关于我正在处理的问题的最佳选择的反馈。

为了给你一些背景知识,我最近继承了一个损坏的业务应用程序(我们的项目正在使用它,所以我们负责修复它),我来自 SharePoint 开发背景,所以有点 C#、ASP.NET 和 SQL。

目前我们的应用程序存在问题,我们不断收到超时错误,我已将其范围缩小到 Web 应用程序调用一堆存储过程来更新其他表中的状态字段,当某些变化可能影响其他表的状态时对象。

在不彻底检查此应用程序的情况下,我确定我们最好的选择是卸载这些存储过程以在后台运行,而不是绑定到 UI。我查看了几个选项,包括:

  • 创建一个单独的线程来处理执行。 (仍然超时)
  • 使用 BackgroundWorker(仍然超时,显然不应该,但我似乎无法找出导致它等待 BackgroundWorker 完成的原因)
  • 将 Stored Proc 执行移至作业,然后我从另一个 SP 调用该作业。 (这可行,但限制是我一次只能运行一个作业,如果多个用户更新对象,他们会收到异常,因为作业无法启动)

现在我们已将这些存储过程移动到每天两次的脚本中,该脚本会更新所有对象,但这只是临时修复。

我正在考虑两个选项,我希望获得一些关于实施您认为是最佳选项的指导:

  • 继续使用作业,并让正在执行的存储过程将数据库中的项目排入队列,作业将循环通过该数据库直到为空。正在执行的存储过程必须在添加新条目时检查作业是否正在运行,然后采取相应措施。

  • 有人建议我使用 Service Broker,但我一点也不熟悉它的用途。我知道这可能是一个更好的整体解决方案,因为它允许我以更具事务性的方式对这些更新进行排队。

我认为这两个选项都是可行的,尽管我需要一些帮助来理解第二个选项的实施。我的另一个难题是这些存储过程在 45s 到 20m 的任何地方运行,我如何通知更改对象的用户他/她的更新已经完成?这是我回退到使用该作业的地方,因为我可以简单地将用户字段添加到“队列”中,并让存储的过程在最后发送一封快速电子邮件。

想法、建议?也许我想太多了?

【问题讨论】:

    标签: c# asp.net sql stored-procedures service-broker


    【解决方案1】:

    如果您使用 .NET 4.5 和 C# 5.0,请使用异步;如果您使用 .NET 4.0,请使用 TPL。它们具有相同的底层(几乎),并且异步功能基于 TPL(具有一些额外的内部结构)。

    在任何情况下,TPL 都是一个合适的选择。

    【讨论】:

    • 你指的是像Task.Factory.StartNew(() => DAL.UpdateComptuerStatusByApplicationID(originalApplication.AutoNumber), TaskCreationOptions.LongRunning);这样的事情我已经尝试过这个并且在sql连接上遇到了超时,所以我增加了超时阈值但是UI仍然会挂起直到完成,通常会导致ASP 超时。是因为我将它嵌套在另一个函数中,该函数在调用存储过程以更新状态之前调用更新实际对象?
    【解决方案2】:

    听起来 Service Broker 将是解决此问题的绝佳解决方案。确实,要了解它的工作原理需要一定的学习曲线,但它基本上非常简单,尤其是当您在单个数据库中实现时。

    http://msdn.microsoft.com/en-US/library/ms345108(v=SQL.90).aspx 有一个很好的(幸好简短)介绍它的工作原理

    【讨论】:

      【解决方案3】:

      看看Asynchronous Procedure Execution。但是如果可以改进更新,我会先看看,也许一个简单的索引可以消除超时,和/或尝试利用snapshot isolation。在不承诺对应用程序代码进行“大修”的情况下尝试这些会更简单。

      我还必须敦促您阅读Waits and Queues。这是一种用于识别性能瓶颈的 SQL Server 方法。是一种将“超时”问题缩小到更可操作的问题(阻塞、IO、索引等)的好方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-23
        • 1970-01-01
        • 1970-01-01
        • 2021-08-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多