為什么要有ASP.NET工作流
介紹ASP.NET工作流的由來
人們經(jīng)常要求軟件開發(fā)人員構建可支持長時間運行操作的 Web 應用程序。在線商店的結賬過程就是一個例子,它只需數(shù)分鐘即可完成。盡管依照某些標準這就是一個長時間運行操作,但我將在本文中探討一個尺度完全不同的長時間運行操作:需持續(xù)數(shù)天、數(shù)周,甚至數(shù)月才可完成的操作。此類操作的一個示例是職位的申請過程,它涉及多人之間的交互以及眾多實際文檔的交換。
首先,我們從 ASP.NET 角度來考慮一個較為良性的問題:您需要為在線商店的結賬操作構建一個解決方案。由于其持續(xù)時間的特殊性,我們需對此解決方案特別考慮一些事項。例如,您可能會選擇在某個 ASP.NET 會話中存儲購物車數(shù)據(jù)。您甚至可以選擇將該會話狀態(tài)移動到進程外狀態(tài)服務器或數(shù)據(jù)庫,以更新站點和負載平衡。即便如此,您會發(fā)現(xiàn)輕松解決此問題所需的全部工具均由 ASP.NET 自身提供。
但如果操作的持續(xù)時間變得比典型的 ASP.NET 會話持續(xù)時間(20 分鐘)更長,或需要多名參與者(就象剛才的聘用示例)時,ASP.NET 不能提供充分的支持。您也許還記得 ASP.NET 工作進程會在空閑時自動關閉并定期自身回收。這會導致長時間運行操作出現(xiàn)嚴重錯誤,因為這些進程中保存的狀態(tài)將會丟失。
設想一下,您將需要在單個進程內部托管這些運行時間超長的操作。顯然,出于上述原因,ASP.NET 工作進程并不適用于它們。因此需要創(chuàng)建一個窗口服務,它的職責就是執(zhí)行這些操作。如果從不重新啟動此服務,將會比直接使用 ASP.NET 更有可能得到解決方案,因為從理論上講,擁有無法自動重新啟動的服務進程可確保不會丟失長時間運行操作的狀態(tài)。
但這樣真的可以解決該問題嗎?很可能不會。如果服務器需要負載平衡該怎么辦?如果思路僅局限于單個進程將會使情況變得非常困難。更糟糕的是,如果需要重新啟動服務器或進程崩潰該怎么辦? 如果這樣將會導致丟失已運行的所有操作。
事實上,當操作需要數(shù)天或數(shù)周才可完成時,您就需要一個獨立于執(zhí)行該操作進程的生命周期的解決方案。通常這是一個不爭的事實,對于 ASP.NET Web 應用程序更是尤為重要。
管理ASP.NET工作流
Windows Workflow Foundation (WF) 可能并不是構建 Web 應用程序時想到的技術。但 WF 提供的多個主要功能讓工作流解決方案有了不同尋常的意義。有了 WF,您就能通過從進程空間中徹底卸載空閑工作流,并在工作流繁忙時自動將它們重新加載到活動進程中,讓長時間運行的操作具備進程獨立性(請參見圖 1)。利用 WF 可以克服 ASP.NET 工作進程不確定生命周期的影響,并為 Web 應用程序內的長時間運行操作做好準備。
圖 1 跨進程實例的工作流保留操作
WF 組合了兩個主要特性來實現(xiàn)此功能。首先,異步活動在等待外部事件時向工作流運行時發(fā)出工作流空閑的信號。接下來,持久性服務從該進程卸載空閑的工作流,然后將其保存到某個持久存儲位置(如數(shù)據(jù)庫)并在做好再次運行準備時重新加載工作流。
這樣的進程獨立性還有其他的優(yōu)點。它提供了一種簡單的負載平衡方式及持久性——在遇到進程或服務器故障時能實現(xiàn)容錯。
以上就是對ASP.NET工作流的需求及其優(yōu)點的簡單介紹。
【編輯推薦】