介绍ASP.NET工作流的由来
人们经常要求软件开发人员构建可支持长时间运行操作的 Web 应用程序。在线商店的结账过程就是一个例子,它只需数分钟即可完成。尽管依照某些标准这就是一个长时间运行操作,但我将在本文中探讨一个尺度完全不同的长时间运行操作:需持续数天、数周,甚至数月才可完成的操作。此类操作的一个示例是职位的申请过程,它涉及多人之间的交互以及众多实际文档的交换。
首先,我们从 ASP.NET 角度来考虑一个较为良性的问题:您需要为在线商店的结账操作构建一个解决方案。由于其持续时间的特殊性,我们需对此解决方案特别考虑一些事项。例如,您可能会选择在某个 ASP.NET 会话中存储购物车数据。您甚至可以选择将该会话状态移动到进程外状态服务器或数据库,以更新站点和负载平衡。即便如此,您会发现轻松解决此问题所需的全部工具均由 ASP.NET 自身提供。
但如果操作的持续时间变得比典型的 ASP.NET 会话持续时间(20 分钟)更长,或需要多名参与者(就象刚才的聘用示例)时,ASP.NET 不能提供充分的支持。您也许还记得 ASP.NET 工作进程会在空闲时自动关闭并定期自身回收。这会导致长时间运行操作出现严重错误,因为这些进程中保存的状态将会丢失。
设想一下,您将需要在单个进程内部托管这些运行时间超长的操作。显然,出于上述原因,ASP.NET 工作进程并不适用于它们。因此需要创建一个窗口服务,它的职责就是执行这些操作。如果从不重新启动此服务,将会比直接使用 ASP.NET 更有可能得到解决方案,因为从理论上讲,拥有无法自动重新启动的服务进程可确保不会丢失长时间运行操作的状态。
但这样真的可以解决该问题吗?很可能不会。如果服务器需要负载平衡该怎么办?如果思路仅局限于单个进程将会使情况变得非常困难。更糟糕的是,如果需要重新启动服务器或进程崩溃该怎么办? 如果这样将会导致丢失已运行的所有操作。
事实上,当操作需要数天或数周才可完成时,您就需要一个独立于执行该操作进程的生命周期的解决方案。通常这是一个不争的事实,对于 ASP.NET Web 应用程序更是尤为重要。
管理ASP.NET工作流
Windows Workflow Foundation (WF) 可能并不是构建 Web 应用程序时想到的技术。但 WF 提供的多个主要功能让工作流解决方案有了不同寻常的意义。有了 WF,您就能通过从进程空间中彻底卸载空闲工作流,并在工作流繁忙时自动将它们重新加载到活动进程中,让长时间运行的操作具备进程独立性(请参见图 1)。利用 WF 可以克服 ASP.NET 工作进程不确定生命周期的影响,并为 Web 应用程序内的长时间运行操作做好准备。
图 1 跨进程实例的工作流保留操作
WF 组合了两个主要特性来实现此功能。首先,异步活动在等待外部事件时向工作流运行时发出工作流空闲的信号。接下来,持久性服务从该进程卸载空闲的工作流,然后将其保存到某个持久存储位置(如数据库)并在做好再次运行准备时重新加载工作流。
这样的进程独立性还有其他的优点。它提供了一种简单的负载平衡方式及持久性——在遇到进程或服务器故障时能实现容错。
以上就是对ASP.NET工作流的需求及其优点的简单介绍。
【编辑推荐】