管理自动化的.NET代码执行的最佳实践

3

我正在设计一个新的软件解决方案,其中包括在IIS中托管的.NET Web应用程序,用户可以从中触发各种功能(必须是.NET代码)以异步执行后台操作。我正在寻找适当的技术和架构来实现这一目标。需要支持的一些重要特性包括:

  1. 当后台功能完成时,Web应用程序需要被通知,以便通过websockets通知浏览器上的用户。

  2. 如果执行功能的进程崩溃,在重新启动该进程时,它必须能够检测到代码未完成并重新启动该代码的执行。

  3. 必须能够安排后台功能在未来某个时间点开始。同样,如果托管进程崩溃,在重新启动时,它必须重新了解计划任务,以便在适当的时间成功开始执行功能。

如果通过在IIS实例内启动新线程来实现后台功能,则易于实现#1。然而,必须编写特殊代码来支持#2和#3,并且许多人认为,在Web应用程序中托管需要能够从崩溃中恢复或在将来进行调度的后台功能是不良实践。

另一个选项是在Windows服务中托管后台进程。如果这样做,有哪些方法可以解决#1、#2和#3?这仍然需要自定义代码-因此是否已经有软件可以处理这些要求?

3个回答

2
针对这种情况,在IIS中托管Web应用程序只占问题的10%。HTTP是无状态和无连接的。因此,如果浏览器没有请求任何内容,IIS(因此ASP.NET应用程序)将无法响应。我遇到的类似场景已通过以下方式解决:
  1. 托管调度Windows服务来管理#2和#3。
  2. 托管Web应用程序,供用户访问最新数据。
现在重要的是需要共享的数据,即Web服务和Web应用程序之间需要共享的数据。简单地使用数据库更新与给定唯一ID相对应的状态。当用户在Web应用程序中请求有关该唯一ID的更新时,它可以轻松获取更新信息并将其发送回最终用户。

我打算使用Websockets来更新连接的浏览器,一旦WebApp知道有变化。我打算使用一个中央数据库,所以您建议Web应用程序定期轮询数据库以获取更改,并在检测到更改时通过Websockets转发它们吗? - Simon Green
重要的是要知道Web应用程序除非被请求,否则不会执行任何操作。因此,如果在Web浏览器中打开的网页不断向Web应用程序发出轮询请求,它可以不断地在数据库中查找数据并响应。就像Stackoverflow中的更新或任何新活动一样。它不是由服务器推送的,而是由浏览器窗口中的网页拉取的。 - Abhinav
嗨,Abhinav,我对WebSocket技术的理解是,它的主要特点是保持浏览器和Web应用程序之间的开放连接,以便Web应用程序可以向浏览器推送信息,而无需专门请求。 - Simon Green
顺便问一下,你所说的WebSockets是指这里解释的内容吗 -> http://www.paulbatum.com/2011/09/getting-started-with-websockets-in.html?我真的不太确定它是如何工作的。那只会改变我的答案,去掉轮询部分。 - Abhinav
@SimonGreen:如果你按照那个链接所解释的使用WebSockets,你仍然需要一个Windows服务来完成#2和#3。现在使用WebSockets会更容易实现#1。 - Abhinav
再次您好,我同意 - 我认为您的答案和下面的另一个答案基本上是相同的。但是,我仍然想知道是否存在任何经过验证的软件,可以为代码提供托管容器并处理#2和#3(以及可能的#1),在我开始自己实施之前。 - Simon Green

1
最佳实践是将处理过程分离。即通过将请求放入队列(例如数据库表)并使用单独的工作程序服务来轮询该队列以获取任务,并仅在成功完成任务时标记它们为已完成(例如将结果放入另一个表中,或将“已完成”列标记为 true),然后使用单独的服务/网站轮询结果并通知用户。
如果工作程序服务崩溃/失败,则不应将队列项标记为已完成,并且每当它重新启动时,它可以轻松地再次轮询未完成的任务队列。

嗨,Saeb,是的,这都有道理,并且可行 - 但听起来好像所有的代码都必须特别编写。你知不知道是否有任何证明过可以为我完成这个工作的代码管理软件? - Simon Green
@SimonGreen,看一下Parallel .NETAzure WebJobs SDK也许会引起你的兴趣。 - Saeb Amini

1

IIS的问题在于,它会在一定时间后终止其工作进程。虽然有一些技巧可以避免这种情况发生,但是如果你想要拥有可靠的基础架构,就像前面提到的那样,你应该将此代码放在一个 Windows 服务中,并通过 WCF 与你的 Web 应用程序通信。 你需要在后台使用数据库来存储你的任务,以便在计算机关闭或服务崩溃后重新安排这些任务。

我们正在建立一个解决这类问题的框架,但它还没有完全发布。它允许在 Windows 服务或 Linux 守护进程(使用 MONO)中托管排队/定时的工作。它具有维护子进程的能力,因此,如果子进程崩溃,它可以自动重新启动。由于父进程是一个服务或守护进程,它将随着计算机的启动和关闭而启动和关闭。与 IIS 托管不同,这些进程永远不会被自动终止,也不必保持活动状态。

父/子进程管理是开源的,可以在此处找到:

http://www.nuget.org/packages/ChildProcesses/

http://childprocess.codeplex.com/

这个框架本身被称为Crawler-Lib Framework,但目前只发布了工作流引擎。服务、模块管理、WCF模块、数据库连接器等将很快发布。您可以在此处找到它:

http://www.crawler-lib.net/


谢谢你提供的链接,Thomas。我会去看一下。 - Simon Green
你会为我做同样的事情。因为这是所有正在进行中且尚未发布的工作,请在发现有趣的内容时与我联系。 - Thomas Maierhofer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接