【问题标题】:Strategy for managing long running processes in a web app?在 Web 应用程序中管理长时间运行的进程的策略?
【发布时间】:2011-08-30 14:11:59
【问题描述】:

我正在开发一个 web asp.net 应用程序。该应用程序的一个特点是用户可以将一些长时间运行的操作排队,然后点击运行队列将被处理。

我不希望用户必须坐下来等待所有操作完成或确实保持浏览器/应用程序打开。但是,如果他们保留或返回该页面,我希望他们能够看到每个作业的状态,即等待、进行中、完成或失败。

我自然会寻找最强大、最可靠和可扩展的解决方案,因为随时可能有大量工作在队列中。

根据我的研究,有人建议 asp.net 可以调用 Windows 服务?那可能是托管 WCF Web 服务。

向过去可能有类似要求的任何人寻求任何建议。

【问题讨论】:

    标签: c# asp.net sql-server wcf windows-services


    【解决方案1】:

    还可以查看 MSMQ,

    http://msdn.microsoft.com/en-us/library/ms711472(v=vs.85).aspx

    基本上,Web 应用程序将“作业”或“作业组”放入队列中。

    该服务不断运行,将下一个“作业”或“一组作业”出列并开始处理它们。

    完成后,服务将结果放入 Web 应用程序访问的另一个队列或数据库(或其他一些共享资源)中,并显示其状态或结果。

    享受吧。

    【讨论】:

    • 看看 MSMQ,它看起来确实很优雅,但是在我的场景中,我不确定我是否能看到使用数据库表并观察它而不是队列有什么好处,我错过了什么吗?跨度>
    • 视情况而定,在您的场景中这可能是不必要的,但如果您的系统需要增长,集成这样的队列可能会更加可靠和可扩展。为了保持体面的“状态消息”,您可能无论如何都希望涉及数据库。如果你走“后台线程”路线,我只会警告你以在负载平衡环境中工作的方式构建它。
    【解决方案2】:

    一个通常好的方法是让 Windows 服务执行计划的作业。您可以使用像 Quartz.NET 这样的库,它具有各种调度功能。如果您不需要特定的调度,您可以让 Windows 服务充当工作进程并简单地使用作业。除此之外,您还需要促进 Web 应用程序和执行排队任务的服务之间的通信。为此,您可以使用多种技术,例如使用数据库中的表或仅使用某种其他类型的进程间通信技术(远程处理、命名管道、套接字、消息队列等)。

    我实际上实现了这样的东西,其中有一个 Windows 服务执行预定的作业,并且有一个 ASP.NET Web 应用程序为这些作业提供所有请求。 ASP.NET 应用程序将一些作业发布到数据库中,这些作业稍后由服务进程使用。

    【讨论】:

    • 就像你说的,我并没有严格地尝试安排任何事情,但 Quartz.NET 看起来确实很有趣。理想情况下,我喜欢在将作业添加到队列后调用服务并告诉它运行。如果我每分钟左右轮询一次,我想它并没有太多......
    • 是的,您还可以使用 MSMQ 或简单的套接字向您的服务发出新作业可用的信号。这里有更多关于 IPC 的信息:stackoverflow.com/questions/50153/…
    【解决方案3】:

    使用 Windows 服务是个好主意。不过,我没有任何使用它的经验,也不知道意外的陷阱。
    此外,您可能想查看Fire And Forget 模式。 (更多信息和样品可以找到here) 使用多线程可能是另一种选择。欲了解更多信息,请查看:
    http://msdn.microsoft.com/en-us/magazine/cc163587.aspx
    http://msdn.microsoft.com/en-us/magazine/cc164128.aspx#S6
    http://msdn.microsoft.com/en-us/library/ff647332.aspx

    【讨论】:

      【解决方案4】:

      我也有类似的问题。我有一个 Web 应用程序可以启动一个长期运行的进程。我想更新用户界面,以便用户看到正在发生的事情。我有一个类可以设置一些属性,然后开始该过程。这是我的方法。

      1) 向我的班级添加一个属性,即工作 ID。
      2)当网络用户启动作业时,生成一个新的作业id并将其分配给上面的属性。
      3)当我的课程正在运行时,更新数据库中的日志表。根据工作 ID 更新它。
      4) 在前端,有一些简单的 ajax 进程每隔 x 秒检查一次作业 id 的状态。

      就是这样。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-04
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        • 1970-01-01
        • 2011-02-27
        • 2012-01-05
        • 2015-03-18
        相关资源
        最近更新 更多