我正在设计一个新的软件解决方案,其中包含一个托管在IIS中的.NET Web应用程序,用户可以从中触发各种功能(同样必须是.NET代码),以便在后台异步执行。我正在寻找适当的技术和架构来实现这一目标。需要支持的一些重要功能包括:
当后台功能完成时,需要通知Web应用程序,以便它可以通过websockets通知浏览器上的用户。
如果执行该功能的进程崩溃,则在重新启动该进程时,它必须能够检测到代码未完成并重新启动该代码的执行
必须可以安排后台功能在将来的某个时刻开始。同样,如果托管进程崩溃,重新启动时必须重新知道已调度的任务,以便它在适当的时间仍然成功开始执行该功能。
如果通过在IIS实例中启动新线程来实现后台功能,则可以轻松实现#1。但是,必须编写特殊代码来支持#2和#3,并且似乎很多人认为托管后台功能需要能够从崩溃中恢复或将来安排在Web App中,这很糟糕实践。
另一种选择是在Windows服务中托管后台进程。如果是这样,解决#1,#2和#3的最佳方法是什么?这仍然需要自定义代码 - 那么是否有可用的软件来处理这些要求?
答案 0 :(得分:2)
对于这种情况,在IIS中托管Web应用程序只会出现问题的10%。 HTTP是无状态且无连接的。因此,如果浏览器没有请求任何内容,IIS(因此ASP.NET应用程序)将无法响应。我遇到的类似情况修复如下:
现在需要在Web Service和Web App 之间共享数据的重要方面。只需使用数据库即可更新与给定唯一ID相对应的状态。当用户请求更新Web应用程序中的唯一ID时,它可以轻松获取更新信息并将其发送回最终用户。
答案 1 :(得分:1)
最佳做法是将处理分开。即通过将请求放入队列(例如数据库表)并使用单独的工作服务来启动网站上的处理,该服务轮询该队列以获取任务,并且仅在成功完成它们时将其标记为已完成(例如,通过放置结果)在另一个表中,或将已完成的列标记为true),然后使用单独的服务/网站轮询结果并通知用户。
如果工作服务崩溃/失败,则不应将队列项标记为已完成,并且无论何时重新启动它都可以轻松地再次轮询未完成的任务队列。
答案 2 :(得分:1)
IIS的丑陋之处在于IIS在一段时间后终止其工作进程。有一个视图技巧可以避免这种情况,但实际上如果你想拥有一个可靠的基础设施,如上所述,你应该将这些代码放在Windows服务中,并通过WCF与你的web应用程序进行通信。 您需要在后台存储数据库来存储您的任务,以便在计算机关闭或服务崩溃后重新安排它们。
我们正在为这类问题构建一个框架,但尚未完全发布。它允许在Windows服务或Linux deamon(使用MONO)中承载排队/预定的工作。它具有维护子进程的能力,因此如果子进程崩溃,它可以自动重启。由于父进程是服务或守护进程,因此将使用计算机启动和关闭它。而不是IIS托管这个进程永远不会自动终止,不能保持活着。
父/子流程管理是开源的,可在此处获取:
http://www.nuget.org/packages/ChildProcesses/
http://childprocess.codeplex.com/
框架本身称为Crawler-Lib Framework,但目前只发布了工作流引擎。服务,模块管理,WCF模块,数据库连接器等将很快发布。它可以在这里找到: