|
先談幾點(diǎn)個(gè)人體會(huì)
- 業(yè)務(wù)服務(wù)如果是是否存在可重用的原子服務(wù),如果有則應(yīng)該先做原子服務(wù)再做組合服務(wù)。
- 原子服務(wù)存在的意義在于存在多個(gè)業(yè)務(wù)服務(wù)復(fù)用,如果不存在不識(shí)別為原子服務(wù)。
- 從業(yè)務(wù)出發(fā),為了保證事物完整性和服務(wù)設(shè)計(jì)的無狀態(tài)原則,應(yīng)該如何設(shè)計(jì),哪些能拆,哪些不能拆。
- 根據(jù)BPEL流程編排,會(huì)增加業(yè)務(wù)校驗(yàn)類細(xì)粒度服務(wù),應(yīng)從滿足多個(gè)業(yè)務(wù)編排需求來考慮可重用性。
- 根據(jù)安全性原則,哪些服務(wù)需要拆分,根據(jù)拆分服務(wù)提供不同屬性類別的服務(wù)
- 根據(jù)性能原則,哪些粗粒度服務(wù)當(dāng)不滿足性能測(cè)試要求時(shí)候需要拆分為多個(gè)細(xì)粒度的服務(wù)
另外關(guān)于服務(wù)顆粒度的問題,可以看百度百科的說明。
什么是服務(wù)的顆粒度?一般的說法,服務(wù)顆粒度(servicegranularity)就是指一個(gè)服務(wù)包含的功能大小。舉個(gè)例子,對(duì)于電信九七系統(tǒng)中的營(yíng)業(yè)受理來說,提交客戶訂單就是一個(gè)典型的粗粒度的服務(wù),而實(shí)現(xiàn)這個(gè)提交訂單服務(wù)的一系列內(nèi)部操作,比如說創(chuàng)建客戶資料,生成客戶訂單,記錄產(chǎn)品屬性,更新帳務(wù)關(guān)系等等就可能成為一系列細(xì)粒度的服務(wù)。細(xì)粒度的服務(wù)(fine-grained)提供相對(duì)較小的功能單元,或交換少量的數(shù)據(jù)。完成復(fù)雜的業(yè)務(wù)邏輯往往需要編排大量這種細(xì)粒度的服務(wù),通過多次的服務(wù)請(qǐng)求交互才能實(shí)現(xiàn)。相反,粗粒度的服務(wù)(coarse-grained)則是在一個(gè)抽象的接口中封裝了大塊的業(yè)務(wù)/技術(shù)能力,減少服務(wù)請(qǐng)求交互的次數(shù),但相應(yīng)也會(huì)帶來服務(wù)實(shí)現(xiàn)的復(fù)雜性,交互大量的數(shù)據(jù),并因此而不能靈活更改以適應(yīng)需求的變化。就像任何事物都有兩面性一樣,服務(wù)粒度不能太大或者太小,而應(yīng)該大小合適。一個(gè)良好的SOA架構(gòu)設(shè)計(jì),必須在服務(wù)粒度設(shè)計(jì)上維護(hù)一種平衡,以獲得成本降低,靈活響應(yīng)的好處。
盡管沒有一本Bible讓我們可以依此正確地設(shè)計(jì)服務(wù)的粒度,但我們還是能從與之相關(guān)的多方面利弊權(quán)衡的設(shè)計(jì)實(shí)踐中,總結(jié)出一些能夠幫助正確選擇服務(wù)顆粒度的經(jīng)驗(yàn)法則。識(shí)別并設(shè)計(jì)一個(gè)粒度適中的服務(wù),我們可以主要從以下三個(gè)方面權(quán)衡考量。
x重用性
所謂重用性,就是指服務(wù)能夠應(yīng)用于不同上下文的能力。重用可以說是SOA的核心思維,通過重用獲得降低開發(fā)維護(hù)成本,縮短應(yīng)用交付周期,提升質(zhì)量等種種好處。
與任何基于分解的范例相一致,顆粒度的大小直接影響到服務(wù)的可重用性。一個(gè)簡(jiǎn)單的經(jīng)驗(yàn)法則就是細(xì)粒度的服務(wù)更容易被重用。換句話說,就是顆粒度越粗,服務(wù)越少被重用或者越難以被重用。因?yàn)殡S著顆粒度增加,越來越多的業(yè)務(wù)規(guī)則和上下文信息被嵌入到業(yè)務(wù)邏輯中,服務(wù)逐漸變得具有特定的業(yè)務(wù)意義。要使用它,我們必須首先了解它到底封裝了哪些規(guī)則,否則我們無法確信這個(gè)服務(wù)正是我們所需要的。這并不意味著我們就不要構(gòu)建粗粒度的服務(wù),事實(shí)上粗粒度的服務(wù)往往還停留在”business-grained”層面,它讓業(yè)務(wù)用戶和IT人員可以直接對(duì)話,對(duì)業(yè)務(wù)有直接的意義,應(yīng)該暴露出來。同時(shí),如果我們僅僅機(jī)械地考慮重用性,將導(dǎo)致大量顆粒度很小的功能單元,這將對(duì)系統(tǒng)整體性能和容量帶來嚴(yán)重的影響。就拿大家常用來描繪SOA的樂高玩具為喻,一個(gè)最小尺寸的1x1的樂高積木,帶有一個(gè)標(biāo)準(zhǔn)的凸起接口,通過它幾乎可以與任何其它樂高積木拼裝出任意可以想想的物體,其廣泛的重用性是不言而喻的。但是當(dāng)你真正嘗試用這種粒度的積木完成一個(gè)復(fù)雜物體拼裝的時(shí)候,你可能會(huì)感嘆:“Oh,My God! It’s missionimpossible!”,因?yàn)椋瑸榇烁冻龅臅r(shí)間和成本的代價(jià)幾乎是不可接受的。因此,我們?cè)谝恍南M麡?gòu)建美好的重用世界之前,需要先掂量清楚服務(wù)顆粒度的選擇。
在這里,我借用關(guān)于演講的一個(gè)有名的“迷你裙定律”來嘗試表達(dá)服務(wù)顆粒度的選擇上的權(quán)衡之道。“mini-skirttheory”告訴我們,一個(gè)出色的演講應(yīng)該“short enough to keep people interested, butlong enough to cover the importantpart”。套用在服務(wù)顆粒度的選擇上,一個(gè)設(shè)計(jì)良好的服務(wù)應(yīng)該“fine-grained enough to be reusable,but coarse-grained enough to make business sense”。
x靈活性
所謂靈活性,就是能夠容易地因情形做出改變的能力。SOA的目標(biāo)之一就是讓IT變得更靈活,能夠更快地適應(yīng)持續(xù)變化的業(yè)務(wù)環(huán)境。因此,靈活性作為設(shè)計(jì)良好的服務(wù)的重要考量,理所當(dāng)然地也是選擇服務(wù)粒度的重要標(biāo)準(zhǔn)之一。眾所周知,細(xì)粒度的服務(wù)可以更容易地組裝,為交付新的業(yè)務(wù)功能或改變業(yè)務(wù)流程提供了更多的靈活性。但是,僅僅考慮靈活性將導(dǎo)致大量的細(xì)粒度的服務(wù),帶來昂貴的開發(fā)成本,并使得維護(hù)變得困難。因此,在考慮業(yè)務(wù)流程靈活性的同時(shí),考慮后臺(tái)服務(wù)的良好組織、效率和開發(fā)維護(hù)成本,對(duì)于識(shí)別和設(shè)計(jì)粒度適中的服務(wù)是至關(guān)重要的。
我們知道,服務(wù)識(shí)別方法之一就是top-down的一級(jí)級(jí)流程分解,直到不能或者不需要進(jìn)一步分解為止,其中識(shí)別出來的的業(yè)務(wù)活動(dòng)就是候選的業(yè)務(wù)服務(wù)。因此,一個(gè)有效的經(jīng)驗(yàn)法則就是區(qū)別對(duì)待不同的業(yè)務(wù)流程,因?yàn)椴⒉皇敲恳粋€(gè)業(yè)務(wù)流程都需要相同的靈活性。如何確定哪些流程需要更多的靈活性,哪些流程不需要,可以參考SAP就企業(yè)業(yè)務(wù)流程的一個(gè)觀點(diǎn)。SAP將流程劃分為核心流程(coreprocess)和支撐流程(contextprocess)。其中,支撐流程是指那些不可或缺的,但又不影響企業(yè)差異化的流程,如財(cái)會(huì)管理流程等,它們關(guān)注的是如何提升生產(chǎn)效率,降低生產(chǎn)成本。因此這些流程在分解過程中,一旦識(shí)別出自治的(事務(wù)一致、上下文獨(dú)立的)、粗粒度的服務(wù)就可以結(jié)束,因?yàn)樗鼈兿鄬?duì)穩(wěn)定。而核心流程是指企業(yè)獨(dú)特的,差異化的,代表企業(yè)競(jìng)爭(zhēng)力的業(yè)務(wù)流程,如營(yíng)銷銷售流程等。它們需要比支撐流程更細(xì)粒度地分解,以獲得最大的靈活性,因?yàn)樗鼈兪菚r(shí)刻變化的。
x性能
靈活性和效率往往是成對(duì)出現(xiàn)的,性能因素自然也是限制服務(wù)粒度不能太大或者太小的約束之一。 DanFoody曾在他的weblog里建議Webservice的每一個(gè)operation執(zhí)行應(yīng)該在5ms到5s之間完成,小于5ms或者大于5s就意味著服務(wù)粒度要么太小,要么太大。我在這里倒不想評(píng)價(jià)這個(gè)量化的指標(biāo)有多大指導(dǎo)意義,而是借此希望引起大家的思考,并不是服務(wù)粒度越小或者越大,系統(tǒng)性能就會(huì)一定越好。
一個(gè)服務(wù)本身的復(fù)雜度以及業(yè)務(wù)到服務(wù)映射的復(fù)雜度(即實(shí)現(xiàn)一個(gè)業(yè)務(wù)活動(dòng)所需的服務(wù)調(diào)用次數(shù))是影響SOA性能的兩個(gè)主要方面。服務(wù)顆粒度越大,意味著包含的功能越多,業(yè)務(wù)邏輯越復(fù)雜,網(wǎng)絡(luò)延遲就會(huì)增加,對(duì)客戶端響應(yīng)變慢。而服務(wù)顆粒度越小,也就意味著包含的功能越簡(jiǎn)單,雖然單個(gè)服務(wù)執(zhí)行效率很高,但從業(yè)務(wù)意義上,完成一項(xiàng)業(yè)務(wù)任務(wù)所需的服務(wù)調(diào)用次數(shù)越多,來回請(qǐng)求響應(yīng)次數(shù)增加。一般來說,服務(wù)都是遠(yuǎn)程調(diào)用的,這種來回請(qǐng)求響應(yīng)的次數(shù)增加意味著顯著的性能開銷。因此,為了保證服務(wù)的性能可控,一方面需要限制服務(wù)包含的功能范圍和復(fù)雜度,也就是說服務(wù)粒度不能太粗;另一方面需要限制服務(wù)調(diào)用的次數(shù)和復(fù)雜度,也就是說服務(wù)粒度不能太細(xì)。我想這才是前面提到的5ms和5s背后真正的原因。很顯然,二者的著眼點(diǎn)是背離的,為了符合性能的需求,需要在二者之間折中妥協(xié)。
除以上幾點(diǎn)之外,還存在其它可能影響服務(wù)顆粒度決策的因素,比如服務(wù)類別和使用范圍等等。如果服務(wù)使用的范圍有限,如僅僅在Intra-Application范疇,則可以選擇相對(duì)較細(xì)粒度的服務(wù)接口,為服務(wù)請(qǐng)求者提供更多的靈活性;隨著范圍擴(kuò)大,服務(wù)大小也應(yīng)隨之?dāng)U大,如Multi-Enterprise的范疇,則要求服務(wù)盡可能提供粗粒度的、較穩(wěn)定的接口,保證服務(wù)請(qǐng)求者以一致的方式使用系統(tǒng)中所暴露出的服務(wù)。最后,需要記住的一點(diǎn)是,服務(wù)的顆粒度在其生命周期內(nèi)不是一成不變的,它是隨著業(yè)務(wù)的調(diào)整變化,以及服務(wù)的迭代發(fā)展過程,不斷演化精煉、甚至重構(gòu)的。
it知識(shí)庫:談SOA服務(wù)的設(shè)計(jì)粒度,轉(zhuǎn)載需保留來源!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。