工作流模式之異常模式
作者:alphaflow來源:flowyun.com訪問:243時(shí)間:2019-05-09
在流程執(zhí)行的過程中既有成功的情景,也會(huì)有失敗的情景.如果某個(gè)流程中執(zhí)行失敗了,應(yīng)該采取哪些處理措施呢?這些處理措施是不是有最佳實(shí)踐呢?答案就是工作流技術(shù)中的異常模式。
異常并不是工作流管理系統(tǒng)才有的,所有軟件信息系統(tǒng)都有異常, 先來看看信息體統(tǒng)中的常規(guī)異常,有別于后續(xù)要介紹的工作流異常。常規(guī)異常,實(shí)際上就是指我們?nèi)粘i_發(fā)中所遇到的各種程序異常和業(yè)務(wù)異常。常規(guī)異常對(duì)于IT人員并不陌生,我們幾乎每天都在與各種程序語言中的異常打交道,例如Java語言中各種各樣的Checked Exception和UnChecked Exception。對(duì)于常規(guī)異常,不同的語言提供了不同的處理機(jī)制。
一個(gè)穩(wěn)定健壯的應(yīng)用系統(tǒng)是離不開良好的異常處理設(shè)計(jì)與實(shí)現(xiàn)的。程序語言只提供了最基本的異常處理機(jī)制,在實(shí)際的開發(fā)中,往往需要設(shè)計(jì)者給出更易用、更友好的、統(tǒng)一的異??蚣茉O(shè)計(jì)。
1.工作流異常的概念
那么什么是工作流異常呢?工作流異常是指對(duì)理想的協(xié)同處理過程(利用已有資源,以一種最佳的方式來達(dá)到任務(wù)的要求)產(chǎn)生的任何偏移,包括活動(dòng)執(zhí)行時(shí)遇到的錯(cuò)誤、代理人之間的通信錯(cuò)誤、對(duì)任務(wù)和資源的變化缺少支持等。即工作流在協(xié)同處理的過程中,出現(xiàn)的任何偏離了正?;蚱谕男袨槎际枪ぷ髁鳟惓P袨?。例如,工作流的正常期望是流程的各個(gè)活動(dòng)能夠順利執(zhí)行結(jié)束,為顧客輸出他想要的價(jià)值,如果不能得到這個(gè)結(jié)果,則屬于工作流異常。
需要注意的是,相當(dāng)多情況下工作流異常需要在人工參與的情況下進(jìn)行傳播,而非自動(dòng)傳播,并且在異常處理完成后,過程應(yīng)該從異常發(fā)生處繼續(xù)執(zhí)行,這是與高級(jí)編程語言異常處理模式的很大不同。
2.工作流異常的分類
按照異常的預(yù)測(cè)程度分為可預(yù)測(cè)異常和不可預(yù)測(cè)異常
a)可預(yù)測(cè)異常:可以預(yù)見的并且已經(jīng)定義好異常處理器的工作流異常,通常對(duì)出現(xiàn)的異常情況有充分的了解,并明確定義了異常處理過程;
b)不可預(yù)測(cè)異常:在模型定義階段無法預(yù)知的異常情況,通常需要在異常發(fā)生時(shí)通過人工參與處理該類異常。
按照觸發(fā)源分為外部異常和內(nèi)部異常
a)外部異常:由參與工作流執(zhí)行的系統(tǒng)外部因素所引起的異常,如操作系統(tǒng)、網(wǎng)絡(luò)、數(shù)據(jù)庫、應(yīng)用軟件和硬件設(shè)備等故障所產(chǎn)生的異常。
b)內(nèi)部異常:由工作流管理系統(tǒng)自身印發(fā)的異常,如不能為活動(dòng)指定執(zhí)行者、不能獲取活動(dòng)執(zhí)行所需的資源、活動(dòng)錯(cuò)過截止期等。
對(duì)于按照觸發(fā)源劃分,美國喬治亞大學(xué)的ZongweiLuo與Amit Sheth等人又進(jìn)行了更為細(xì)致的劃分,產(chǎn)生了以下工作流異常分類:應(yīng)用異常、工作流異常、基礎(chǔ)結(jié)構(gòu)異常。
應(yīng)用異常:指由任務(wù)的執(zhí)行者通過這個(gè)任務(wù)項(xiàng)參與到業(yè)務(wù)系統(tǒng)中,進(jìn)行業(yè)務(wù)操作。此時(shí),任務(wù)執(zhí)行者如果由于誤操作(例如輸入了錯(cuò)誤的參數(shù))或故意執(zhí)行非正常期望的操作(例如進(jìn)行駁回),從而導(dǎo)致工作流不能正常執(zhí)行,稱之為應(yīng)用異常。工作流引擎還會(huì)在執(zhí)行的過程中自動(dòng)調(diào)用業(yè)務(wù)系統(tǒng)提供的接口或服務(wù)(有可能位于ESB中),如果業(yè)務(wù)系統(tǒng)提供的接口或服務(wù)發(fā)生異常(例如不可調(diào)用),同樣會(huì)引起工作流不能正常執(zhí)行,此時(shí)也稱之為應(yīng)用異常。實(shí)際上,應(yīng)用異??梢远x為由工作流的應(yīng)用者本身所引起的異常。
工作流異常:指由工作流系統(tǒng)本身直接激發(fā)的異常,又分為系統(tǒng)異常和用戶定義異常。前者包括時(shí)間異常(工作流實(shí)例違反時(shí)間限制,如任務(wù)運(yùn)行時(shí)間超過給定期限)、資源異常(資源不可用,例如生成任務(wù)時(shí)找不到建模期定義的任務(wù)執(zhí)行者)、數(shù)據(jù)異常(工作流相關(guān)數(shù)據(jù)違反其約束條件)。后者實(shí)際上就是指上文提到的可預(yù)測(cè)異常,也就是說,由工作流的設(shè)計(jì)者在建模期對(duì)于可預(yù)測(cè)的工作流系統(tǒng)本身的多個(gè)異常進(jìn)行定義,并且為每個(gè)異常定義一個(gè)異常處理,在異常發(fā)生時(shí)做出相應(yīng)的處理。
基礎(chǔ)結(jié)構(gòu)異常:指由應(yīng)用服務(wù)器、數(shù)據(jù)庫、網(wǎng)絡(luò)、操作系統(tǒng)、硬件設(shè)備等基礎(chǔ)設(shè)施所引起的異常。
從技術(shù)角度來看,上面三層異常模型應(yīng)該是最容易理解與應(yīng)用的。從工作流產(chǎn)品設(shè)計(jì)和實(shí)現(xiàn)的角度,我們也認(rèn)為是最清晰的。當(dāng)然除了上述兩個(gè)主要的分類方式以外,還有一些其他的分類方式,按照工作流可探測(cè)的異常事件可分為:
工作項(xiàng)執(zhí)行失敗
超時(shí)
資源不可用
外部觸發(fā)
違反約束
3.工作流異常的處理
忽略策略:工作流的某個(gè)活動(dòng)在執(zhí)行過程中,主要行為已經(jīng)執(zhí)行完畢。此時(shí)如果出現(xiàn)異常,但是此異常所產(chǎn)生的行為不影響后續(xù)活動(dòng)的執(zhí)行,那么此時(shí)就可以采用忽略策略。忽略此異常,讓活動(dòng)繼續(xù)執(zhí)行,直至轉(zhuǎn)移到其后續(xù)活動(dòng)。
放棄策略:若在某個(gè)活動(dòng)的執(zhí)行過程中,出現(xiàn)的異常使得整個(gè)活動(dòng)不能繼續(xù)執(zhí)行下去,此時(shí)就只有采取放棄策略。實(shí)際上,這一策略的本質(zhì)就是回滾。對(duì)于工作流的某個(gè)原子活動(dòng)的某次狀態(tài)轉(zhuǎn)移來講,所有的行為(活動(dòng)本身的執(zhí)行、此活動(dòng)節(jié)點(diǎn)綁定的事件或服務(wù)的執(zhí)行、任務(wù)的分配等)都處于一個(gè)原子事務(wù)中,因此失敗即回滾。
替換策略:在工作流執(zhí)行過程中,若某個(gè)活動(dòng)執(zhí)行時(shí)出現(xiàn)異常使其不能繼續(xù),但存在另外一個(gè)可選的活動(dòng)或另外一條執(zhí)行路徑使得程序可以繼續(xù),此時(shí)就可以采用替換策略。
補(bǔ)償策略:補(bǔ)償是發(fā)生在兩個(gè)原子事務(wù)甚至多個(gè)原子事務(wù)之間;或者說,發(fā)生在事務(wù)遞交之后。在業(yè)務(wù)操作已經(jīng)跨越了多個(gè)原子事務(wù)之后,如果在最后一個(gè)事務(wù)處發(fā)生失敗,需要消除對(duì)以前的一個(gè)或多個(gè)業(yè)務(wù)操作所產(chǎn)生的影響,則必須執(zhí)行補(bǔ)償策略。
重試策略:在工作流活動(dòng)執(zhí)行的過程中,對(duì)于出現(xiàn)異常的活動(dòng)重新嘗試執(zhí)行,直到活動(dòng)執(zhí)行成功,或者達(dá)到最大重試次數(shù),這種策略稱之為“重試策略”。重試策略一般應(yīng)用在異步執(zhí)行的場(chǎng)景中,因?yàn)椴恢朗裁磿r(shí)候重試成功,所以不能一直同步等待。
工作流模型定義了其組成任務(wù)(包括活動(dòng)與子過程)的各種執(zhí)行屬性。為了滿足異常處理的要求,我們?cè)诠ぷ髁髂P椭屑尤肴蝿?wù)的事務(wù)特征和異常處理屬性定義。表1簡要描述了這些屬性,其中包括任務(wù)執(zhí)行失敗后的回退(Rollback)屬性,由于并非所有任務(wù)都是原子性的,所以在任務(wù)執(zhí)行失敗后需要取消任務(wù)失敗所產(chǎn)生的影響;任務(wù)執(zhí)行完成后的補(bǔ)償(Compensate)屬性,可以在后向恢復(fù)時(shí)將已經(jīng)完成的影響消除,恢復(fù)到未執(zhí)行狀態(tài);任務(wù)失敗后的重試(Retry)屬性;以及該任務(wù)所有可以引發(fā)的異常和提供的異常處理過程。
除了工作流異常處理的五個(gè)最基本策略,目前在工作流異常領(lǐng)域主要有三個(gè)基本方法來針對(duì)具體的應(yīng)用。
失敗補(bǔ)償法:這種方法的基本思想就是每一個(gè)活動(dòng)對(duì)應(yīng)一個(gè)補(bǔ)償活動(dòng),這個(gè)補(bǔ)償活動(dòng)在語義上就是消除(undo)對(duì)已執(zhí)行的活動(dòng)所產(chǎn)生的影響。當(dāng)一個(gè)活動(dòng)執(zhí)行失敗時(shí),就啟動(dòng)執(zhí)行補(bǔ)償活動(dòng)(通常是前面活動(dòng)的逆執(zhí)行),直到找到一個(gè)分支點(diǎn),使整個(gè)過程能繼續(xù)向前執(zhí)行。
ECA規(guī)則法:事件描述了潛在異常情況的出現(xiàn),條件用來表示當(dāng)事件發(fā)生時(shí)不同的處理前提,動(dòng)作是指對(duì)異常事件應(yīng)做出的反應(yīng)。ECA規(guī)則要求每一具體的異常類別建立相應(yīng)的規(guī)則(也稱為觸發(fā)器),根據(jù)發(fā)生的異常事件,在滿足一定的條件的前提下去調(diào)用相應(yīng)的動(dòng)作(活動(dòng)、子程序、人工干預(yù)等)。
基于知識(shí)庫法:先對(duì)異常分類,定義每一類別的特征,建立起知識(shí)庫;每個(gè)異常有一種“異常探測(cè)”處理模板來捕獲異常,通過自頂向下的啟發(fā)式搜索找到異常的原因,再采用相應(yīng)的過程去處理。這種方法與ECA規(guī)則類似,不過這種方法為人機(jī)交互處理異常(選擇合適的處理方法)提供了更多的信息。
4. 異常處理模式
在工作流當(dāng)中部分短事務(wù)可以采用回滾策略,但對(duì)于長事務(wù),則必須采用補(bǔ)償策略來解決。補(bǔ)償一般都是基于事件驅(qū)動(dòng)的,即在異常(此處異常是廣義上的,如流程駁回也可以稱之為異常)發(fā)生時(shí),通過異常事件去觸發(fā)執(zhí)行駁回事件。駁回事件由業(yè)務(wù)系統(tǒng)提供,以數(shù)據(jù)庫的CRUD(Create、Read、Update、Delete)操作為例,插入的補(bǔ)償操作是刪除、更新的補(bǔ)償操作是另一次更新。一句話,“原有業(yè)務(wù)操作的逆操作即定義為補(bǔ)償操作”。
相當(dāng)多的情況下,異常處理過程需要人工參與進(jìn)行??紤]到人員在工作流系統(tǒng)中的嚴(yán)格角色的和權(quán)限定義,單靠部分參與者可能無法完成一個(gè)異常處理過程,二頻繁的異常傳播又會(huì)導(dǎo)致處理過程復(fù)雜,效率下降。所以在不進(jìn)行異常傳播時(shí),可以采用組織層次的異常處理協(xié)調(diào)機(jī)制,實(shí)現(xiàn)多人參與的異常處理模式。