1 概述
傳統(tǒng)面向服務(wù)架構(gòu)(Service-oriented Architecture,SOA)由服務(wù)提供者、服務(wù)注冊中心、服務(wù)請求者3個部分組成,對其可恢復(fù)性研究主要集中在注冊中心與服務(wù)實例。目前,基于SOA的業(yè)務(wù)系統(tǒng),在原有框架上集成了業(yè)務(wù)流程管理(Business Process Management,BPM)模塊,應(yīng)用分散自治的Web服務(wù),借助Web服務(wù)業(yè)務(wù)流程執(zhí)行語言(Web Services Business Process Execution Language,WS-BPEL),實現(xiàn)松耦合的應(yīng)用平臺。鑒于BPM在SOA中起到的關(guān)鍵作用,為了提高業(yè)務(wù)的連續(xù)性,流程執(zhí)行引擎的可恢復(fù)性成為SOA應(yīng)用的研究熱點。由于基于服務(wù)的流程非常脆弱,容易出現(xiàn)異常,因此業(yè)務(wù)流程運行過程中的狀態(tài)保存與恢復(fù)方法是本領(lǐng)域有待解決的關(guān)鍵問題。
本文基于有色Petri網(wǎng)(Colored Petri Nets,CPN)模型,設(shè)計一種多輸入多輸出(Multiple Input Multiple Output,MIMO)的高可靠流程執(zhí)行結(jié)構(gòu)。在此基礎(chǔ)上提出引擎保存流程執(zhí)行狀態(tài)與中間結(jié)果的方法,并在流程異常中斷時,能夠根據(jù)保存的信息迅速恢復(fù)流程上下文,保證業(yè)務(wù)的連續(xù)性。
2 相關(guān)工作
目前,BPEL流程可靠性和容錯性領(lǐng)域的研究工作很多,主要集中在如文獻中討論的單個服務(wù)失效時替代服務(wù)的動態(tài)選擇問題上,針對流程出錯時狀態(tài)保存與恢復(fù)方法的研究較少。
開源引擎Active BPEL、Apache ODE和商業(yè)引擎Oracle BPM是當前3種主流的BPEL流程執(zhí)行引擎。3種執(zhí)行引擎都借助數(shù)據(jù)庫的存儲能力,應(yīng)用持久化技術(shù)記錄了流程執(zhí)行狀態(tài),但是沒有針對應(yīng)用服務(wù)獲取恢復(fù)執(zhí)行所需的最小狀態(tài)集,并不適合流程中斷時狀態(tài)的恢復(fù)。
文獻指出Petri網(wǎng)具有并行性、不確定性和異步性等特點,適合描述和分析分布式系統(tǒng)。而文獻提出CPN的概念,它可以承載具有類型的數(shù)據(jù);赟OA的業(yè)務(wù)流程由消息觸發(fā)服務(wù),而CPN的Token通過定義顏色模擬不同種類的消息,因此CPN更適合業(yè)務(wù)流程的建模。
3 面向服務(wù)架構(gòu)的高可靠流程執(zhí)行引擎設(shè)計
本節(jié)從適合狀態(tài)保存的角度定義分布式業(yè)務(wù)流程,并對引擎進行擴展,設(shè)計一種支持狀態(tài)保存與恢復(fù)的高可靠流程執(zhí)行引擎。
3.1 分布式業(yè)務(wù)流程定義
Petri網(wǎng)由位置、變遷、弧和標記4個元素組成。對于BPEL調(diào)用的伙伴服務(wù),用變遷表示其執(zhí)行,用位置表示服務(wù)的前提條件和后續(xù)狀態(tài),用弧表示流程的執(zhí)行順序,用標記表示不同類型的消息,通過消息的傳遞模擬實際系統(tǒng)的動態(tài)運行行為。
定義1元消息)元消息m為五元組(id,name,type,ms,value),其中,id標識不同的元消息;name表示元消息的名稱;type∈Σ指消息的類型;ms∈M表明元消息所屬的消息;value是元消息的值。
定義2(消息)消息M是分布式業(yè)務(wù)流程執(zhí)行環(huán)境中狀態(tài)交換的信息單元,其中,M(m1,m2,...,mn)是元消息在域上的笛卡爾積;根據(jù)交互雙方的不同,消息可以分為代表伙伴服務(wù)之間狀態(tài)傳遞的內(nèi)部狀態(tài)信息Mi和代表與流程執(zhí)行引擎之間消息傳遞的外部交互信息M0。
定義3(業(yè)務(wù)流程)業(yè)務(wù)流程BP為九元組(P,T,F(xiàn),Σ,M,C,G,E,I),其中,(P,T,F(xiàn),C,G,E)是CPN表示流程的基本結(jié)構(gòu);Σ為有限非空消息類型集合;M是有限消息的集合;I是消息處理函數(shù)。負函數(shù)I-(p,t)表示變遷t消耗位置p的消息資源;正函數(shù)I+(t,p)表示變遷t產(chǎn)生位置P的消息資源。
3.2 高可靠執(zhí)行引擎設(shè)計
BPEL流程運行過程中出現(xiàn)的錯誤可以是調(diào)用伙伴服務(wù)時產(chǎn)生的程序錯誤,也可以是引擎框架的未預(yù)期錯誤。流程運行時產(chǎn)生的上下文環(huán)境,包括執(zhí)行狀態(tài)和中間結(jié)果,前者記錄流程執(zhí)行的當前位置,后者記錄服務(wù)問傳遞的相關(guān)信息。在錯誤發(fā)生時,根據(jù)同步記錄的流程上下文迅速恢復(fù)執(zhí)行環(huán)境是保障分布式業(yè)務(wù)正確完成的一種重要方法。
支持狀態(tài)保存與恢復(fù)的高可靠流程執(zhí)行引擎結(jié)構(gòu)如圖1所示,BPEL語言定義的業(yè)務(wù)流程以組合服務(wù)的形式登記到注冊中心,當客戶向執(zhí)行引擎提交請求時,引擎通過流程需求描述信息在注冊中心選擇符合需求的業(yè)務(wù)流程并返回流程標識。執(zhí)行引擎根據(jù)流程模板生成實例并執(zhí)行。每次服務(wù)成功執(zhí)行后,在將服務(wù)執(zhí)行結(jié)果傳遞給鄰接的伙伴服務(wù)的同時,服務(wù)調(diào)用結(jié)果作為流程的中間結(jié)果,以消息的形式返回執(zhí)行引擎并持久化到數(shù)據(jù)庫。當整個實例結(jié)束后,將執(zhí)行結(jié)果返回給引擎,至此一個流程實例執(zhí)行完畢。與其他執(zhí)行引擎相比,該結(jié)構(gòu)主要在2個方面進行高可靠性擴展:
(1)在Web服務(wù)執(zhí)行成功后將服務(wù)調(diào)用結(jié)果返回給執(zhí)行引擎,由引擎持久化到數(shù)據(jù)庫;
(2)根據(jù)實例與引擎的交互情況,由引擎記錄下流程的執(zhí)行狀態(tài)。
圖1 支持狀態(tài)保存與恢復(fù)的高可靠流程執(zhí)行引擎結(jié)構(gòu)
Web服務(wù)實質(zhì)上是一個消息處理框架,由消息觸發(fā)Web服務(wù),并以消息的形式將服務(wù)的執(zhí)行結(jié)果傳遞給鄰接的伙伴服務(wù)。通過對流程監(jiān)控,當服務(wù)失效時啟動備份服務(wù),將存儲在引擎數(shù)據(jù)庫的中間結(jié)果以SOAP消息的形式發(fā)送給服務(wù)節(jié)點,保證了流程狀態(tài)的前后一致性。針對執(zhí)行引擎的失效,根據(jù)關(guān)聯(lián)矩陣記錄的流程執(zhí)行狀態(tài),由本地或異地引擎解析出流程中斷前的執(zhí)行位置,并通過最小補償回退的方式繼續(xù)流程的運行,減少了不必要的補償操作,且整個過程對用戶是透明的。
4 基于MIMO模式的業(yè)務(wù)流程狀態(tài)保存與恢復(fù)
常見的BPEL業(yè)務(wù)流程采用單輸入單輸出的工作模式,即流程開始時輸入請求消息,流程結(jié)束時向客戶返回應(yīng)答消息。這樣的工作模式將流程運行時的中間信息隱藏起來,不利于流程運行時狀態(tài)的跟蹤。本節(jié)基于定義3,使流程支持多輸入多輸出的工作模式,并采用關(guān)聯(lián)矩陣和變遷狀態(tài)表記錄流程運行時的狀態(tài)。
4.1 基于關(guān)聯(lián)矩陣的執(zhí)行狀態(tài)保存與恢復(fù)
當BPEL業(yè)務(wù)流程運行時,伙伴服務(wù)間主要包括順序、并行、選擇、循環(huán)4種執(zhí)行順序。其中,t代表調(diào)用Web服務(wù);P代表流程執(zhí)行時消耗或產(chǎn)生的消息。對于循環(huán)結(jié)構(gòu),采用循環(huán)展開方法,將循環(huán)分解成選擇結(jié)構(gòu)和順序結(jié)構(gòu),由于流程模型支持多消息輸入結(jié)構(gòu),變遷序列調(diào)用的是同一個Web服務(wù)。
定義4(關(guān)聯(lián)矩陣)BP是一個業(yè)務(wù)流程網(wǎng),且P={p1,p2,...,Pn},T={t1,t2,...,tm},則矩陣C=[cij](1≤i≤n,l≤j≤m)是BP的關(guān)聯(lián)矩陣,當且僅當:
關(guān)聯(lián)矩陣記錄了流程中位置和變遷的鄰接關(guān)系。當cij=-1時,表示消息觸發(fā)行為;當cij=l時,表示行為產(chǎn)生消息。設(shè)counter()為計數(shù)函數(shù)且n≥2,n∈N+,令counter(pi=1)=a,counter(pi=-1)=b且counter(tj=-1)=c,則:(1)當a=0^b=l時,表示Pi為初始狀態(tài);(2)當a=1^b=0時,表示Pi為結(jié)束狀態(tài);(3)當a=l^b=l時,表示順序執(zhí)行關(guān)系;(4)當a=l^b≥n時,表示并行執(zhí)行關(guān)系,并發(fā)度為n;(5)當c≥n時,表示選擇執(zhí)行關(guān)系,選擇度為n。
在流程執(zhí)行過程中,可以通過BPEL提供的錯誤和事件管理從句以及運行時監(jiān)控方法對流程進行監(jiān)控管理。由監(jiān)控程序得知流程在tj處出現(xiàn)異常中斷,通過最小補償回退的思想對流程進行恢復(fù)。(1)若c=1^b=l,則代表變遷tj,調(diào)用的伙伴服務(wù)w,處于順序執(zhí)行鏈路上;(2)若c=l^b≥1,則代表變遷島調(diào)用的伙伴服務(wù)wj處于并行執(zhí)行鏈路的一個路徑上;(3)若c≥n,則代表變遷tj調(diào)用的伙伴服務(wù)wj處于選擇執(zhí)行鏈路的一個分支上。
在恢復(fù)了流程執(zhí)行狀態(tài)的前提下,提供消息上下文,為備份服務(wù)傳送中間結(jié)果,這是保證流程正確運行的有效方法。
4.2 基于變遷狀態(tài)表中闊結(jié)果的保存與恢復(fù)
由于BPEL業(yè)務(wù)流程無論是主動調(diào)用
定義5(變遷狀態(tài)表)變遷狀態(tài)表是一個關(guān)系數(shù)據(jù)表,它是變遷t∈T在消息接收域I-和消息產(chǎn)生域,I+上的笛卡爾積。其中,I-和I+域中的元素是服務(wù)提供者,或者客戶與流程執(zhí)行引擎之間傳遞的消息Mo;Mo=Mi+Σmi,即外部交互信息等于內(nèi)部狀態(tài)信息與元消息集的廣義和。
BPEL運行時中間結(jié)果的保存與恢復(fù)過程如圖2所示,執(zhí)行引擎將從客戶端接收到的消息以及I+中的元素,由decompose()函數(shù)分解存儲,每個存儲單元即是一個元消息。對應(yīng)Web服務(wù)描述語言(WSDL)文檔中
圖2 BPEL運行時中間結(jié)果的保存與恢復(fù)過程
變遷狀態(tài)表和元消息表隨著流程實例的開始而創(chuàng)建,隨著流程實例的結(jié)束而銷毀。當一個流程模板有多個實例同時運行時,運用實例版本和信息加鎖的機制可以很好解決資源競爭的問題。
5 實例分析與性能評價
本節(jié)通過經(jīng)典SOA應(yīng)用的商務(wù)規(guī)劃,進一步驗證BPEL業(yè)務(wù)流程運行過程中狀態(tài)的保存與恢復(fù)方式,并對其開銷進行分析。
5.1 實例分析
流程描述了如下場景,用戶提交員工資料和出差信息,通過Web服務(wù)檢索員工的艙位等級,并發(fā)地從多家航空公司查找所能提供的機票信息,從中選擇票價較低的航空公司,并將確認信息返回給用戶直至發(fā)送成功。
該SOA應(yīng)用支持服務(wù)間的順序、并行、選擇、循環(huán)的執(zhí)行關(guān)系,不提供流程狀態(tài)保存的執(zhí)行引擎,當流程異常中斷時,通常需要整個流程重做,帶來了不必要的開銷。即使應(yīng)用BPEL自身的恢復(fù)機制,由于過多依靠流程設(shè)計人員的經(jīng)驗,因此限制了流程恢復(fù)的靈活性和高效性。而提供流程狀態(tài)保存功能的執(zhí)行引擎將記錄執(zhí)行過程中的最小狀態(tài)集合,針對異常情況,向備份單元發(fā)送狀態(tài)信息,保證業(yè)務(wù)連續(xù)性,同時提高流程引擎的可靠性,雖然帶來了一定的開銷,但是為用戶可接受的。
當模擬流程調(diào)用AmericanAirlines服務(wù)發(fā)生超時,通過關(guān)聯(lián)矩陣(見圖3)定位到變遷f3出現(xiàn)調(diào)用服務(wù)異常,由于counter(t3=-1)=1^counter(p3=-1)=2,因此說明變遷t3處于并行執(zhí)行鏈路的一個分支,且并行度為2。根據(jù)最小補償回退的思想,在變遷狀態(tài)表l中查找到t3I-={AmericanAirlines,FlightDetails},說明變遷t3調(diào)用AmericanAirlines服務(wù),服務(wù)由消息FlightDetails激活;在元消息表2中查找ms字段為FlightDetails的元消息FlightData,由sendms()函數(shù)將其發(fā)送給備份服務(wù),保證了業(yè)務(wù)的連續(xù)執(zhí)行。
圖3 關(guān)聯(lián)矩陣
表1 變遷狀態(tài)
表2 元消息格式
5.2 性能評價
綜合以上分析,提出的業(yè)務(wù)流程運行過程中狀態(tài)的保存與恢復(fù)方法具有以下特點和性能:
(1)為流程執(zhí)行提供多輸入多輸出結(jié)構(gòu)。這樣的執(zhí)行結(jié)構(gòu)在提高可靠性的同時帶來了一定的開銷。假設(shè)n個伙伴服務(wù)按順序結(jié)構(gòu)組成業(yè)務(wù)流程,各服務(wù)與引擎交互的時間為te,各伙伴服務(wù)之間的交互時間為ts,忽略各變遷調(diào)用服務(wù)的執(zhí)行時間,則單輸入單輸出的業(yè)務(wù)流程執(zhí)行時間為2te+(n-1)ts。由于分布式環(huán)境下te與ts近似相等,在服務(wù)與引擎交互的同時向伙伴服務(wù)發(fā)送流程信息,則多輸入多輸出的業(yè)務(wù)流程執(zhí)行時間為nte+(n-1)ts。
(2)為流程恢復(fù)提供最小狀態(tài)集合。流程執(zhí)行過程中只存儲應(yīng)用級的狀態(tài)信息,包括執(zhí)行狀態(tài)和中間結(jié)果;當流程恢復(fù)時,通過組合元消息向備份服務(wù)發(fā)送其所需的最小消息集。
(3)為流程恢復(fù)提供本地策略和異地遷移。利用應(yīng)用與數(shù)據(jù)分離的2層工作模式,當流程異常中斷時,可以根據(jù)持久化的狀態(tài)信息將流程進行本地恢復(fù)或異地遷移。
(4)較優(yōu)的恢復(fù)點目標(Recovery Point Objective,RPO)支持多步回退。在一般情況下,按照最小補償回退的思想,只需回退到最近的一步操作。由于記錄了流程實例執(zhí)行過程中全狀態(tài)信息,因此可以由用戶干預(yù),實現(xiàn)多步回退。
(5)較優(yōu)的恢復(fù)時間目標(Recovery Time Objective,RTO)。矩陣和數(shù)據(jù)表具有處理高效的特點,在發(fā)生異常中斷時,可以較快查找到流程執(zhí)行的上下文環(huán)境,只需te時間即可完成恢復(fù)。
6 結(jié)束語
對于SOA架構(gòu)下業(yè)務(wù)流程狀態(tài)的保存與恢復(fù),通過本文提出的解決方案將執(zhí)行狀態(tài)和中間結(jié)果集中到引擎,便于流程的統(tǒng)一管理,對于提高業(yè)務(wù)的連續(xù)性具有重要意義。下一步工作是優(yōu)化保存和恢復(fù)協(xié)議,使其更好地應(yīng)用于業(yè)務(wù)流程執(zhí)行引擎的容錯和容災(zāi)中。
核心關(guān)注:拓步ERP系統(tǒng)平臺是覆蓋了眾多的業(yè)務(wù)領(lǐng)域、行業(yè)應(yīng)用,蘊涵了豐富的ERP管理思想,集成了ERP軟件業(yè)務(wù)管理理念,功能涉及供應(yīng)鏈、成本、制造、CRM、HR等眾多業(yè)務(wù)領(lǐng)域的管理,全面涵蓋了企業(yè)關(guān)注ERP管理系統(tǒng)的核心領(lǐng)域,是眾多中小企業(yè)信息化建設(shè)首選的ERP管理軟件信賴品牌。
轉(zhuǎn)載請注明出處:拓步ERP資訊網(wǎng)http://www.oesoe.com/