費(fèi) 琪
(江蘇自動(dòng)化研究所,江蘇 連云港 222061)
SOA系統(tǒng)往往是由數(shù)量巨大的用戶、業(yè)務(wù)、服務(wù)集成的龐大系統(tǒng),由于不同用戶的需求多樣,使得SOA系統(tǒng)的結(jié)構(gòu)與運(yùn)行機(jī)理呈現(xiàn)出復(fù)雜性[1]。具體表現(xiàn)為:為完成一項(xiàng)用戶請(qǐng)求的業(yè)務(wù),系統(tǒng)中服務(wù)與服務(wù)之間需要并存在通信與互操作[2-3];根據(jù)用戶需求,業(yè)務(wù)與業(yè)務(wù)之間也存在相互協(xié)作;作為SOA的一大優(yōu)勢(shì)(節(jié)省成本),服務(wù)可以被不同業(yè)務(wù)重復(fù)使用;隨著時(shí)間的推移,用戶數(shù)量的增長(zhǎng)以及業(yè)務(wù)范圍的擴(kuò)大,越來(lái)越多的服務(wù)會(huì)被加入,使得系統(tǒng)越來(lái)越龐大[4];若干SOA子系統(tǒng)可以組合為一個(gè)更為龐大的系統(tǒng)[5-6]。
目前對(duì)復(fù)雜系統(tǒng)進(jìn)行可靠性建模并進(jìn)行可靠性評(píng)價(jià)存在很大的困難,傳統(tǒng)的可靠性建模與分析方法如可靠性框圖方法(RBD)、故障模式與影響分析方法(FMECA)、故障樹(shù)分析方法(FTA)[7]等受限于系統(tǒng)規(guī)模,往往針對(duì)系統(tǒng)的靜態(tài)結(jié)構(gòu)進(jìn)行建模分析,同時(shí)很難顧及發(fā)生在系統(tǒng)上的復(fù)雜動(dòng)力學(xué)行為對(duì)系統(tǒng)造成的影響[8-9]。
文中針對(duì)復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠性評(píng)估的研究框架如圖1所示。
圖1 整體研究框架
BPEL流程在執(zhí)行過(guò)程中會(huì)在不同的操作中進(jìn)行轉(zhuǎn)換,在WSDL中描述了一個(gè)服務(wù)所包含的操作,BPEL中描述操作時(shí),會(huì)指明此操作的parternerlink及porttype,也即指明此操作歸屬的服務(wù)。因此要獲取服務(wù)與服務(wù)間的關(guān)系,只需獲取操作間的關(guān)系即可。
通過(guò)對(duì)BPEL規(guī)范進(jìn)行分析,BPEL由8種原子類型活動(dòng)(receive,reply,invoke,assign,throw,exit,wait,emty)[10]和8種結(jié)構(gòu)類型的活動(dòng)(sequence,if,pick,flow,while,repeatUntil,forEach,scope)[11]組成,其中assign為使用新的數(shù)據(jù)對(duì)變量的值進(jìn)行更新;emty,wait,throw和exit為業(yè)務(wù)流程處理中的活動(dòng)。這5個(gè)原子類型的活動(dòng)既沒(méi)有Web服務(wù)與之對(duì)應(yīng)也沒(méi)有結(jié)構(gòu)化的特征,因此不予考慮。receive活動(dòng)和reply活動(dòng)為一個(gè)請(qǐng)求-應(yīng)答流程,構(gòu)成了WSDL中的請(qǐng)求-響應(yīng)操作,invoke活動(dòng)主要是業(yè)務(wù)流程調(diào)用由伙伴在porttype上提供的單向請(qǐng)求操作,即invoke活動(dòng)對(duì)應(yīng)于一個(gè)服務(wù)的執(zhí)行需調(diào)用外界服務(wù)。invoke活動(dòng)表示服務(wù)與服務(wù)之間的相互調(diào)用關(guān)系。
在BPEL的8個(gè)結(jié)構(gòu)化活動(dòng)中,sequence,if,while,repeatUntil和序列化的forEach活動(dòng)提供活動(dòng)之間的一般順序控制;flow和并行化的forEach活動(dòng)則提供活動(dòng)之間的并發(fā)和同步控制;pick提供基于外部事件的不確定的選擇。
sequence活動(dòng)包含一個(gè)或多個(gè)需要順序執(zhí)行的操作;if活動(dòng)和pick活動(dòng)提供了選擇控制操作;flow活動(dòng)提供了多個(gè)操作的同步與并發(fā);while活動(dòng)為特定的操作重復(fù)執(zhí)行,直至條件與while判定條件不符合才終止;repeatUntil活動(dòng)為執(zhí)行一次它所包含的活動(dòng)后,再重復(fù)執(zhí)行此操作,直至條件與repeatUntil判定條件不符合才終止;scope活動(dòng)提供一個(gè)執(zhí)行順序?qū)Π谄渲械幕顒?dòng);forEach活動(dòng)將所包含的scope活動(dòng)執(zhí)行N+1次,其中N為常數(shù)。
由上述分析可知,從一個(gè)BPEL獲取操作對(duì)應(yīng)的原子活動(dòng)為:receive及invoke;操作間的關(guān)系取決于結(jié)構(gòu)化活動(dòng)描述,主要包含如下兩種:順序執(zhí)行(sequence)、并行執(zhí)行(處于并列地位的操作)(if、pick、flow),而while活動(dòng)、repeatUntil無(wú)非是將上述結(jié)構(gòu)化活動(dòng)重復(fù)執(zhí)行,scope與forEach活動(dòng)類似,從獲取操作間的關(guān)系考慮,可以忽略重復(fù)執(zhí)行。
定義1:SOA復(fù)雜網(wǎng)絡(luò)可靠性模型為(S,R),其中S=(S1,S2,…,Sn),表示服務(wù)的向量集合,Si表示第i個(gè)服務(wù);
表示服務(wù)間的依賴關(guān)系,其中Rij表示服務(wù)Si與服務(wù)Sj間的相互調(diào)用關(guān)系,Rij的取值范圍為{-1,0,1,2}。Rij=-1表示服務(wù)Sj調(diào)用服務(wù)Si;Rij=0表示服務(wù)Si與服務(wù)Sj相互間無(wú)關(guān)聯(lián);Rij=1表示服務(wù)Si調(diào)用服務(wù)Sj;Rij=2表示服務(wù)Si與服務(wù)Sj間相互調(diào)用。
定義2:操作符⊕為關(guān)系模型和算子,定義如下:
其中,a、b的取值范圍為{-1,0,1,2}。
由上述定義可知,關(guān)系模型和算子⊕符合交換律及結(jié)合律:
交換律:a⊕b=b⊕a;
結(jié)合律:a⊕b⊕c=a⊕(b⊕c)。
獲取SOA復(fù)雜網(wǎng)絡(luò)可靠性模型算法如下:
Step1:獲取SOA架構(gòu)復(fù)雜網(wǎng)絡(luò)系統(tǒng)中所有的WSDL文件,每個(gè)WSDL對(duì)應(yīng)一個(gè)服務(wù),從而獲取SOA網(wǎng)絡(luò)模型中的服務(wù)向量集合S,針對(duì)每個(gè)WSDL文件獲取各服務(wù)下所含的operation。
Step2:對(duì)服務(wù)間的依賴關(guān)系進(jìn)行初始化,R=0表示各服務(wù)相互間無(wú)依賴關(guān)系。
Step3:對(duì)第一個(gè)BPEL進(jìn)行遍歷,獲取BPEL文件所涵蓋操作及操作歸屬服務(wù)間的依賴關(guān)系。
操作獲取主要通過(guò)讀取BPEL中的receive原子活動(dòng)及invoke活動(dòng)所調(diào)用的操作,通過(guò)partnerlink及porttype獲取操作所歸屬的服務(wù)。操作間的關(guān)系主要通過(guò)讀取BPEL中的sequence及if、pick、flow結(jié)構(gòu)活動(dòng)進(jìn)行獲取,從結(jié)構(gòu)圖的角度進(jìn)行考慮,無(wú)外乎圖2~圖4幾種結(jié)構(gòu)。
圖2 單順序結(jié)構(gòu)
圖3 單并列結(jié)構(gòu)
圖4 混合結(jié)構(gòu)
對(duì)于圖2,依據(jù)服務(wù)間關(guān)系定義可知:R(op1,op2)=-1,R(op2,op3)=-1;對(duì)于圖3,op1,op2,op3相互間不存在調(diào)用,故相互間依賴關(guān)系值為0;對(duì)于圖4可知:R(op1,op2)=-1,R(op1,op3)=-1,R(op2,op4)=-1,R(op3,op5)=-1,R(op4,op5)=-1。
依據(jù)Step1及Step3獲取操作所對(duì)應(yīng)的服務(wù),并分別將結(jié)構(gòu)圖中的操作修正為服務(wù),從而可獲取服務(wù)與服務(wù)間的依賴關(guān)系,并更新步驟2中的R,R=R1。
Step4:對(duì)SOA架構(gòu)復(fù)雜網(wǎng)絡(luò)系統(tǒng)中所有的BPEL類似于Step3進(jìn)行遍歷,獲取由每個(gè)BPEL獲取的服務(wù)與服務(wù)間的依賴關(guān)系,即R2,R3,…,Rn。
Step5:SOA復(fù)雜網(wǎng)絡(luò)可靠性模型中的服務(wù)間依賴關(guān)系為R=R1⊕R2⊕…⊕Rn。
經(jīng)Step1~Step5即可構(gòu)建出SOA復(fù)雜網(wǎng)絡(luò)可靠性模型。
解決網(wǎng)絡(luò)可靠問(wèn)題的有效方法為對(duì)網(wǎng)絡(luò)進(jìn)行脆弱性分析[12]。在簡(jiǎn)單網(wǎng)絡(luò)拓?fù)鋱D中,單個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)是可靠的,但在復(fù)雜網(wǎng)絡(luò)環(huán)境下,單個(gè)網(wǎng)絡(luò)節(jié)點(diǎn)不一定可靠,因此單節(jié)點(diǎn)可靠,不代表整個(gè)網(wǎng)絡(luò)可靠。通過(guò)對(duì)復(fù)雜網(wǎng)絡(luò)環(huán)境進(jìn)行網(wǎng)絡(luò)脆弱性分析可以評(píng)估網(wǎng)絡(luò)整體的可靠性[13-14]。SOA架構(gòu)的軟件往往服務(wù)節(jié)點(diǎn)數(shù)多、結(jié)構(gòu)復(fù)雜,因此通過(guò)對(duì)SOA復(fù)雜網(wǎng)絡(luò)進(jìn)行脆弱性分析找到影響系統(tǒng)的關(guān)鍵節(jié)點(diǎn),提高關(guān)鍵節(jié)點(diǎn)的可靠度從而可提高系統(tǒng)的可靠度。
影響系統(tǒng)的脆弱性參數(shù)有很多,例如介數(shù)、出度、入度等[13],文中選取節(jié)點(diǎn)的出度來(lái)衡量節(jié)點(diǎn)的重要程度。節(jié)點(diǎn)的出度越大,表明調(diào)用該節(jié)點(diǎn)的節(jié)點(diǎn)個(gè)數(shù)越多,因此該節(jié)點(diǎn)的可靠性更易影響系統(tǒng)的可靠度。
由第1節(jié)獲取的服務(wù)間依賴關(guān)系R可計(jì)算出各服務(wù)的出度,如服務(wù)Si的出度計(jì)算公式為:矩陣R的第i行大于0的個(gè)數(shù)。
在考慮復(fù)雜網(wǎng)絡(luò)故障相關(guān)性的脆弱性分析工作中,依次對(duì)各服務(wù)注入故障,采用蒙特卡洛仿真實(shí)驗(yàn)對(duì)系統(tǒng)的動(dòng)態(tài)過(guò)程進(jìn)行計(jì)算機(jī)仿真,觀察此服務(wù)的故障對(duì)系統(tǒng)最終造成的影響。該方法采用的評(píng)價(jià)指標(biāo)為系統(tǒng)中受影響的服務(wù)的數(shù)目(或比例),且假設(shè)各服務(wù)間調(diào)用概率已知。
故障相關(guān)性脆弱性分析算法如下:
Step1:對(duì)服務(wù)Si注入故障,即假設(shè)服務(wù)Si節(jié)點(diǎn)運(yùn)行不正常。
Step2:對(duì)調(diào)用服務(wù)Si的所有節(jié)點(diǎn)進(jìn)行故障傳播仿真實(shí)驗(yàn)。假設(shè)P(Si,Sj)≤Random(0,1)表示服務(wù)Si故障不能傳播到服務(wù)Sj,P(Si,Sj)>Random(0,1)表示服務(wù)Si故障能傳播到服務(wù)Sj,若Si故障傳播到服務(wù)Sj,則繼續(xù)對(duì)服務(wù)Sj做故障傳播仿真實(shí)驗(yàn),直至當(dāng)前故障節(jié)點(diǎn)后續(xù)無(wú)節(jié)點(diǎn)或通過(guò)仿真實(shí)驗(yàn)當(dāng)前故障節(jié)點(diǎn)不能傳播到調(diào)用其服務(wù)的節(jié)點(diǎn)為止。計(jì)算服務(wù)Si所影響到的服務(wù)個(gè)數(shù)。為更好地仿真系統(tǒng)實(shí)際運(yùn)行,重復(fù)Step2實(shí)驗(yàn)n次,對(duì)n次實(shí)驗(yàn)服務(wù)Si所影響到的服務(wù)個(gè)數(shù)求和并取平均值即可得到服務(wù)Si所影響到的服務(wù)個(gè)數(shù)。(P(Si,Sj)表示服務(wù)Sj調(diào)用服務(wù)Si的概率,Random(0,1)表示在(0,1)間的隨機(jī)生成數(shù))
Step3:對(duì)所有的服務(wù)做Step2實(shí)驗(yàn),對(duì)各服務(wù)所影響的服務(wù)個(gè)數(shù)進(jìn)行排序,服務(wù)故障所影響的服務(wù)個(gè)數(shù)越多,表明此服務(wù)在SOA系統(tǒng)中越關(guān)鍵,需提高其可靠度。
故障相關(guān)性的脆弱性分析流程如圖 5所示。
目前主要是通過(guò)建立剖面,對(duì)軟件進(jìn)行測(cè)試,獲取失效數(shù)據(jù),選取可靠性模型,從而得到系統(tǒng)可靠度。針對(duì)復(fù)雜網(wǎng)絡(luò)系統(tǒng),因其系統(tǒng)大,測(cè)試耗費(fèi)時(shí)間較長(zhǎng),對(duì)其組成的各服務(wù)經(jīng)過(guò)測(cè)試,可利用傳統(tǒng)可靠性評(píng)估方法獲取各服務(wù)的可靠度,利用各服務(wù)的可靠度結(jié)合復(fù)雜網(wǎng)絡(luò)可靠性評(píng)估模型可求得系統(tǒng)可靠度。該方法相比傳統(tǒng)可靠性評(píng)估方法所得結(jié)果精確、耗費(fèi)時(shí)間少。
復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠性評(píng)估輸入為:復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠性模型、復(fù)雜網(wǎng)絡(luò)系統(tǒng)各服務(wù)可靠度、復(fù)雜網(wǎng)絡(luò)系統(tǒng)各服務(wù)間調(diào)用概率;輸出為:復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠度。該方法假設(shè)復(fù)雜網(wǎng)絡(luò)系統(tǒng)各服務(wù)可靠度已通過(guò)傳統(tǒng)可靠性評(píng)估方法求得;復(fù)雜網(wǎng)絡(luò)系統(tǒng)各服務(wù)間調(diào)用概率已知。
圖5 故障相關(guān)性脆弱性分析
復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠性評(píng)估算法如下:
Step1:在構(gòu)建的復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠性模型基礎(chǔ)上,根據(jù)各服務(wù)的可靠度,通過(guò)蒙特卡洛仿真實(shí)驗(yàn)獲取系統(tǒng)失效的服務(wù),即得到系統(tǒng)的故障源。
Step2:利用2.2節(jié)“故障相關(guān)性的脆弱性分析方法”獲取Step1中系統(tǒng)故障源所影響的服務(wù)個(gè)數(shù),計(jì)算所影響服務(wù)個(gè)數(shù)所占比例G。
Step4:對(duì)Step1~Step3重復(fù)n次,記錄系統(tǒng)運(yùn)行失效的次數(shù)為nf。
復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠性評(píng)估流程如圖6所示。
圖6 復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠性評(píng)估流程
以在某SOA項(xiàng)目測(cè)試中的模型為依據(jù)說(shuō)明文中方法的有效性。該SOA系統(tǒng)由5個(gè)服務(wù)節(jié)點(diǎn)組成,基于WSDL文件及BPEL文件構(gòu)建出的可靠性模型如圖7所示。
圖7 某項(xiàng)目SOA可靠性模型
假設(shè)服務(wù)A、B、C、D、E間調(diào)用關(guān)系服從等概率事件:即在調(diào)用關(guān)系圖中,任一服務(wù)調(diào)用其他服務(wù)概率相等。則服務(wù)A故障傳播到服務(wù)B的概率為1/2,服務(wù)A故障傳播到服務(wù)C的概率為1,服務(wù)A故障傳播到服務(wù)D的概率為1,服務(wù)A故障傳播到服務(wù)E的概率為1/3;服務(wù)C故障傳播到服務(wù)E的概率為1/3;服務(wù)D故障傳播到服務(wù)B的概率為1/2,服務(wù)D故障傳播到服務(wù)E的概率為1/3。
依據(jù)2.1 “可靠性模型靜態(tài)信息度量”,求得各服務(wù)的出度,如表1所示。
表1 服務(wù)出度度量
依據(jù)2.2“可靠性模型動(dòng)態(tài)分析—故障相關(guān)性的脆弱性分析”對(duì)上述模型進(jìn)行仿真實(shí)驗(yàn),各節(jié)點(diǎn)仿真1 000次,求得的各節(jié)點(diǎn)故障后平均影響的服務(wù)數(shù)如表2所示。
表2 服務(wù)脆弱性分析
服務(wù)B及服務(wù)E后繼無(wú)節(jié)點(diǎn),故二者故障后,平均影響的服務(wù)數(shù)為自身,結(jié)合服務(wù)的出度及服務(wù)故障傳播所影響的服務(wù)數(shù),可定性地認(rèn)為服務(wù)重要程度排序?yàn)椋悍?wù)A>服務(wù)D>服務(wù)C>服務(wù)B(服務(wù)E)。如果要提升系統(tǒng)的可靠性,首先需保障服務(wù)A的可靠度足夠大。
假設(shè)服務(wù)A的可靠度為0.98,服務(wù)B的可靠度為0.95,服務(wù)C的可靠度為0.89,服務(wù)D的可靠度為0.85,服務(wù)E的可靠度為0.8,利用第3節(jié)“復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠性評(píng)估”所求得的可靠度曲線如圖8所示。
圖8 系統(tǒng)可靠度
由圖8可知,所有服務(wù)故障時(shí)才算系統(tǒng)失效,對(duì)應(yīng)的系統(tǒng)可靠度趨近于1,所有服務(wù)正常才算系統(tǒng)正常,對(duì)應(yīng)的系統(tǒng)可靠度接近于0。
文中給出了基于復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠性評(píng)估方法,首先通過(guò)分析SOA架構(gòu)系統(tǒng)軟件的WSDL文件及BPEL文件構(gòu)建可靠性模型;其次通過(guò)對(duì)可靠性模型進(jìn)行靜態(tài)信息度量及動(dòng)態(tài)故障傳播,獲取對(duì)復(fù)雜網(wǎng)絡(luò)系統(tǒng)可靠性影響程度由高到低的節(jié)點(diǎn)排序;最后通過(guò)系統(tǒng)仿真實(shí)驗(yàn)給出SOA架構(gòu)軟件的可靠度計(jì)算方法。