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