當(dāng)前位置:工程項(xiàng)目OA系統(tǒng) > 泛普各地 > 湖南OA系統(tǒng) > 長沙OA系統(tǒng) > 長沙OA軟件行業(yè)資訊
讓企業(yè)SOA項(xiàng)目更可控之必備十大戒條
申請(qǐng)免費(fèi)試用、咨詢電話:400-8352-114
文章來源:泛普軟件面向服務(wù)的架構(gòu)(SOA)是一種組織信息處理的方法。各系統(tǒng)為協(xié)同工作在各方面達(dá)成了協(xié)議,SOA通過減少這些協(xié)議的數(shù)量,能夠降低信息系統(tǒng)互操作性的成本。如果SOA能得到大范圍的應(yīng)用,系統(tǒng)將呈現(xiàn)與現(xiàn)在截然不同的前景,這就好比當(dāng)今貨運(yùn)行業(yè)有別于集裝箱出現(xiàn)前的貨運(yùn)業(yè)時(shí)代一般。然而,目前的應(yīng)用方式卻導(dǎo)致了額外的開支卻并未體現(xiàn)出這些互操作性的優(yōu)勢。將適用于數(shù)據(jù)庫時(shí)代的范式應(yīng)用于SOA中,會(huì)招致反效果,往往是愚蠢的,有時(shí)甚至是十分危險(xiǎn)的設(shè)計(jì)。這些模式必須由新的思想和行為方式所替代,以確保SOA朝著接口更簡單、IT方案更優(yōu)化以及項(xiàng)目更可控的方向發(fā)展。這一點(diǎn)可以通過遵守以下十大戒條來實(shí)現(xiàn)?! ?/P>
引言:SOA的潛在影響
面向服務(wù)的架構(gòu)(SOA)是一種組織信息處理的方法。這種方法以服務(wù)的形式描述所有交互活動(dòng),服務(wù)請(qǐng)求者請(qǐng)求代理完成某些處理,代理確保處理得以完成并將處理結(jié)果反饋給服務(wù)請(qǐng)求者。這種思維方式可以應(yīng)用于業(yè)務(wù)級(jí)別,以描述各組織機(jī)構(gòu)之間的交互;應(yīng)用于功能級(jí)別,以描述組成業(yè)務(wù)流程的活動(dòng)的交互方式;應(yīng)用到信息系統(tǒng)級(jí)別,以描述系統(tǒng)及系統(tǒng)各部分的交互方式。每個(gè)級(jí)別的準(zhǔn)則都是相同的:代理完成所需工作的方式與請(qǐng)求者無關(guān),乃至與是否完全自動(dòng)、完全人工亦或兩者兼具都無關(guān)系。哪怕代理將部分或者甚至全部工作外包給其他代理完成也與請(qǐng)求者無關(guān)。所有請(qǐng)求者所需關(guān)注的是與代理就以下方面達(dá)成一致:請(qǐng)求及響應(yīng)應(yīng)該如何制定,以及服務(wù)的效果如何。
SOA被大肆宣揚(yáng)為一種具有巨大潛力的范式,能夠降低系統(tǒng)發(fā)展、測試及維護(hù)的成本。特別需要指出的是,SOA承諾可以通過大幅度減少達(dá)成協(xié)議的因素的數(shù)量,從而降低信息系統(tǒng)各模塊協(xié)同工作的成本。采用SOA,諸如像計(jì)算平臺(tái)和數(shù)據(jù)格式之間的差別造成的系統(tǒng)間通信屏障會(huì)較采用早期的范式要少得多。這使得更大范圍上的協(xié)作變得可能,因?yàn)樗鼫p少了障礙,使系統(tǒng)設(shè)計(jì)師們不必被強(qiáng)行要求相互達(dá)成一致,就此而言,也使得系統(tǒng)配置員之間不必被強(qiáng)行要求達(dá)成一致。如果這種承諾可以實(shí)現(xiàn),其結(jié)果將會(huì)是革命性的。就像汽車改變了城市區(qū)域形態(tài),集裝箱運(yùn)輸革新了貨運(yùn)行業(yè),以及交易費(fèi)用的降低發(fā)展了現(xiàn)代自由市場經(jīng)濟(jì),SOA將開啟新的合作模式。當(dāng)SOA主導(dǎo)我們應(yīng)用IT的方式,系統(tǒng)前景將與今日迥然不同,好比圍繞汽車來設(shè)計(jì)規(guī)劃的城市和圍繞火車來設(shè)計(jì)規(guī)劃的城市截然不同一般。對(duì)我們之中那些思維受限于目前技術(shù)的人來說,SOA可以產(chǎn)生多大的不同是難以想象的。然而SOA所提供的靈活性優(yōu)勢就好比汽車勝過火車一樣:即便火車可以被制造跑得和汽車一樣快,火車還是絕不可能像汽車那樣提供門到門的運(yùn)輸服務(wù)。把火車站安置在每個(gè)車道的盡頭,亦或甚至把鐵軌鋪設(shè)在每條道路上都是根本不現(xiàn)實(shí)的。
為何此影響尚未實(shí)現(xiàn)
為獲取新范式帶來的好處,我們必須好好利用其所能提供的各種新的可能性。遺憾的是,目前圍繞SOA的言過其實(shí)的宣傳對(duì)這些可能性的提及是言之甚少。大部分討論似乎都關(guān)注于如何利用SOA幫助單獨(dú)信息系統(tǒng)更快速地開發(fā)。然而,這并非SOA所能創(chuàng)造的最大價(jià)值之處。事實(shí)上,SOA是否真正能夠改進(jìn)以往的方法,即各個(gè)功能點(diǎn)通過某一共同的數(shù)據(jù)池(通常是以數(shù)據(jù)庫的方式實(shí)現(xiàn))來實(shí)現(xiàn)交互,還存在爭議。使用SOA來構(gòu)建單獨(dú)、孤立的信息系統(tǒng)就像使用集裝箱在加工廠附近搬運(yùn)貨物一樣:當(dāng)然,它限定了內(nèi)部物流的順序和組織,但是集裝箱更多的是擋了道路而非提供幫助。SOA使信息系統(tǒng)間達(dá)到更好的互操作性,就像集裝箱促使了運(yùn)輸商之間的互操作性一樣。那是一種重要優(yōu)勢,因?yàn)閺男枨蟠_定到信息系統(tǒng)可操作之間的時(shí)間周期通常很大程度上是由互操作性決定的。要使某一信息系統(tǒng)能夠與其操作環(huán)境中的其他系統(tǒng)一起工作,那將會(huì)花費(fèi)比重新構(gòu)建這樣一個(gè)系統(tǒng)更多的時(shí)間和精力。
關(guān)注于SOA在信息系統(tǒng)內(nèi)部而非各系統(tǒng)之間的使用是情況更加惡化的征兆:因?yàn)榭雌饋鞸OA是一種全新的處理我們一直以來所做的事情的方式,我們無法直接獲取它所帶來的收益。SOA概念和技術(shù)正為目前的系統(tǒng)開發(fā)范式所利用。這些范式還是數(shù)據(jù)庫時(shí)代的開發(fā)產(chǎn)物,同時(shí)也帶有數(shù)據(jù)庫技術(shù)的一些限制。在這些限制下應(yīng)用SOA將會(huì)導(dǎo)致額外的開支,而不能獲得額外的收益。然而,這些“數(shù)據(jù)庫化”的范式是如此普遍和有害以至于我們常常忽略了它們對(duì)我們的思維影響有多大。它們是如此根深蒂固,以至于我們會(huì)不自覺將其視作常理。遺憾的是,這樣通常招致相反效果,常常是愚蠢的,有時(shí)甚至是相當(dāng)危險(xiǎn)的。它們導(dǎo)致了一種不好的方案,這種方案集合了數(shù)據(jù)庫時(shí)代的缺點(diǎn)以及SOA不好的一面,而又不能體現(xiàn)SOA必定提供的優(yōu)點(diǎn)。
需要改變什么
SOA范式有其自身的常識(shí)守則,較之?dāng)?shù)據(jù)庫范式的守則截然不同?;窘渎捎惺?xiàng)。前五項(xiàng)關(guān)于如何簡化事物,使其比數(shù)據(jù)庫化的范式要求更加簡化——從堅(jiān)持要點(diǎn)意義上更加簡化。如果我們以此種方式簡化事物,同一問題的不同解決方案相互間協(xié)作的可能性將大大提升。接下來的四項(xiàng)關(guān)于使IT解決方案優(yōu)于同等數(shù)據(jù)庫解決方案,這是通過阻止那些戴著有色眼鏡、慣于數(shù)據(jù)庫思維方式的人開發(fā)出無效解決方案來實(shí)現(xiàn)的。最后一項(xiàng)關(guān)于如何使IT更可控,尤其是組織系統(tǒng)開發(fā)以降低項(xiàng)目復(fù)雜度和風(fēng)險(xiǎn)。SOA使這些成為了可能——同樣也是必須的——因?yàn)樗尭嗟墓δ芙桓冻蔀榛A(chǔ)架構(gòu)。
簡化之理論
在高空雜技表演中,高效的合作的基礎(chǔ)是每個(gè)空中飛人演員完全默契地配合,對(duì)方會(huì)及時(shí)地在每個(gè)時(shí)點(diǎn)出現(xiàn)。一些空中飛人演員非常自信,他們經(jīng)常蒙著眼進(jìn)行表演。他們能夠接到彼此正因?yàn)樗麄兇_定在某個(gè)特定時(shí)刻對(duì)方只可能出現(xiàn)在一個(gè)可能位置。
成功應(yīng)用SOA以達(dá)到最大化的協(xié)作性與高空雜技表演非常相似?;ゲ僮餍砸箨P(guān)于如何進(jìn)行交流的解決方案從數(shù)以百萬計(jì)減少到只有一個(gè),交互雙方都可以依賴該方案。這并不意味著其他方案有問題:這好比我們既可以靠左行駛也可以靠右行駛,但重要的是我們必須都靠同一邊行駛。
當(dāng)只有一方執(zhí)行服務(wù),一方接受服務(wù)時(shí),只要雙方協(xié)議好,具體使用哪種方案其實(shí)并沒有太大區(qū)別。雙方中任一方的特異性可以決定最終方案,無需做更多的溝通努力。畢竟,無論使用哪種方案,這些特異性總要被處理。但是如果是多方請(qǐng)求服務(wù)或者多方執(zhí)行服務(wù),那將呈現(xiàn)不一樣的情景。此時(shí)使通信方案精簡非常重要,如此,各方必須處理各自的特異性,無需面對(duì)另一方。
將信息通信與外科移植手術(shù)對(duì)比很能說明問題。成功的移植手術(shù),要將一個(gè)人身上的器官移植到另一個(gè)人身上,要求該移植器官必須在多方面與接收者匹配,而其中大部分匹配因素與該器官的生物功能無關(guān)。換句話說,被移植的器官必須和接受者本身有相同的特征。因此,我們的器官不能像拼搭樂高積木一樣隨便被移植。目前的信息通信恰恰如此。當(dāng)一個(gè)信息系統(tǒng)為另一個(gè)系統(tǒng)提供服務(wù)時(shí),它們必須在很多方面達(dá)成一致。它們必須使用相同的詞匯(元數(shù)據(jù))、相同的由一方調(diào)用而另一方執(zhí)行的功能集、對(duì)于每個(gè)功能請(qǐng)求應(yīng)答數(shù)據(jù)內(nèi)容的相同期望、相同的編碼系統(tǒng)、相同的技術(shù)通訊協(xié)議、相同的用于信息傳遞的尋址模式、兼容的可預(yù)期的響應(yīng)速率、兼容的確保消息不被丟失的技術(shù)、兼容的認(rèn)證機(jī)制以確保雙方安全通信而不是與冒名者通信、兼容的加密技術(shù)以及密鑰管理以確保消息不被竊聽或者篡改等等。為了促進(jìn)互操作性,必須確保參與各方從彼此獨(dú)立制定各自標(biāo)準(zhǔn)變?yōu)樾纬杉嫒莸臉?biāo)準(zhǔn)規(guī)范。只有當(dāng)一些非常嚴(yán)謹(jǐn)?shù)囊?guī)則得到遵守時(shí)這才有實(shí)現(xiàn)的可能,接口才能減至精要。如此一來特異性將無容身之地。
嚴(yán)謹(jǐn)?shù)囊?guī)則都關(guān)注于如何使得服務(wù)接口更為簡單。我們規(guī)定的越少,爭議的余地就越小。
1.不了解你不需要了解的
你不需要去了解的東西不會(huì)傷害到你
SOA范式的本質(zhì)在于使得合作各方或系統(tǒng)之間達(dá)成最少限度的協(xié)議卻可以實(shí)現(xiàn)最大程度的合作。這是一種巨大的優(yōu)勢,因?yàn)槿魏文悴恍枰私獾臇|西既不需要被測試也不需要被維護(hù)。你不需要去了解的東西不會(huì)傷害到你。假設(shè)40%的系統(tǒng)開發(fā)成本用于測試上,而高達(dá)80%的信息系統(tǒng)生命周期的成本被花費(fèi)到了系統(tǒng)維護(hù)階段,任何SOA范式讓你無需了解的東西都代表了你能節(jié)省的金錢。
元數(shù)據(jù)
你最不需要了解的就是結(jié)構(gòu)、含義以及容許值——這些元數(shù)據(jù)——不會(huì)被系統(tǒng)中篩選、排序或執(zhí)行計(jì)算的邏輯使用的數(shù)據(jù)。你并不需要去了解這些,因?yàn)镾OA技術(shù)使得數(shù)據(jù)和元數(shù)據(jù)同時(shí)出現(xiàn)。你的系統(tǒng)可以實(shí)時(shí)解讀元數(shù)據(jù),所以如果你要做的僅僅是獲取、呈現(xiàn)或傳送相應(yīng)的數(shù)據(jù),你完全不需要為系統(tǒng)構(gòu)建元數(shù)據(jù)知識(shí)。在有相當(dāng)精密的表示(presentation)功能的幫助下,它甚至可以為用戶實(shí)現(xiàn)各種各樣特定的篩選及計(jì)算,且只使用與已有數(shù)據(jù)同時(shí)提供的元數(shù)據(jù),而不是內(nèi)部構(gòu)建元數(shù)據(jù)。
通過解讀數(shù)據(jù)相應(yīng)的元數(shù)據(jù),而不是把元數(shù)據(jù)構(gòu)建到系統(tǒng)中,你的系統(tǒng)不需要隨元數(shù)據(jù)的改變而改變。需要改變的僅僅是源系統(tǒng)。想想如果遵守該守則,你能在開發(fā)、測試和維護(hù)上節(jié)省多少金錢!記住,在兩個(gè)系統(tǒng)上做更改,平均來說,其復(fù)雜度是在單個(gè)系統(tǒng)做更改的四倍,因?yàn)槠渲邪怂懈鞣降膮f(xié)作。
對(duì)于很多面對(duì)客戶的系統(tǒng)來說,表示以及特定篩選功能基本是其主要的功能。這些系統(tǒng)只針對(duì)最基本的客戶數(shù)據(jù)要求內(nèi)部構(gòu)建元數(shù)據(jù)。這并不包括當(dāng)前或過去的訂單、客戶通訊錄、照片、信函以及任何可用于展示的其他數(shù)據(jù),所有這些數(shù)據(jù)都可以用一種不需要這些數(shù)據(jù)本質(zhì)相關(guān)知識(shí)的方式進(jìn)行表示,內(nèi)建于系統(tǒng)中。
技術(shù)
許多你不需要了解的事情是與技術(shù)相關(guān)的。有了SOA,你不需要了解你正在接口的系統(tǒng)是否采用“軟件即服務(wù)”(Software-as-aservice),不需要了解實(shí)施該系統(tǒng)的計(jì)算機(jī)安放在何處,是哪種類型的計(jì)算機(jī)或者運(yùn)行于何種操作系統(tǒng),防火墻是如何配置,使用的是哪種數(shù)據(jù)庫管理系統(tǒng),亦或可以使用哪種交易管理系統(tǒng)。其他你不需要了解的事情是與你所通信的系統(tǒng)內(nèi)部相關(guān)的。尤其是,你不需要去了解任何用于內(nèi)部數(shù)據(jù)存儲(chǔ)的元數(shù)據(jù),因?yàn)槿魏纹渌到y(tǒng)需要同XSD一致的轉(zhuǎn)換都是其自身的問題,而不是你的。
即便如此,使用SOA進(jìn)行通信的各方必須達(dá)成一致的技術(shù)相關(guān)的標(biāo)準(zhǔn)還有很多選擇。特別是有很多與Web服務(wù)相關(guān)的那些標(biāo)準(zhǔn),SOA從業(yè)者將其統(tǒng)稱為WS-*標(biāo)準(zhǔn)(*指可以使用很多可能的標(biāo)簽替換)。在一定程度上,這些標(biāo)準(zhǔn)提出得很恰當(dāng),因?yàn)镾OA社區(qū)并沒有滿足于不去了解它不需要了解的東西;本文這個(gè)白皮書給出了一些指導(dǎo)以期降低由這些標(biāo)準(zhǔn)引起的問題的影響。遵守這些指導(dǎo),SOA需要的先期協(xié)議將比其他方法要少得多。
設(shè)計(jì)穩(wěn)定的接口
如果想獲取SOA提供的種種好處,不去了解你不需要了解的東西會(huì)成為你的習(xí)慣。請(qǐng)銘記這點(diǎn)!比如說,當(dāng)設(shè)計(jì)一個(gè)訂貨服務(wù)時(shí),請(qǐng)記住服務(wù)請(qǐng)求者只需要知道,當(dāng)他需要貨物的時(shí)候該貨物是否會(huì)有貨,而不需要去了解當(dāng)前的庫存量。如果你的程序調(diào)用某一安全服務(wù)以判斷請(qǐng)求活動(dòng)是否被授權(quán),不要在系統(tǒng)內(nèi)構(gòu)建任何超過其所需服務(wù)工作的知識(shí)。例如,如果安全服務(wù)需要使用輸入到程序的安全證書,唯一必須做的就是傳遞該證書!對(duì)你來說,它們只是被封裝在輸入消息中的單個(gè)數(shù)據(jù)項(xiàng)。該證書是否是格式完整的XML也不要去驗(yàn)證。如果,由于某些只有那些負(fù)責(zé)安全的小鬼知道的原因,他們選擇了違背標(biāo)準(zhǔn)的SOA操作或?qū)ψC書進(jìn)行了加密,那么這是他們的問題,不是你的。如果他們改變了任何與證書相關(guān)的東西,你的程序不應(yīng)該為此做任何改變或調(diào)整。任何你不需要了解的東西不會(huì)傷害到你。當(dāng)然了,除非你硬要去了解它,在這種情況下如果你們不想在SOA上浪費(fèi)時(shí)間的話,其他人可能最好離遠(yuǎn)點(diǎn)兒。
不去了解那些你不需要了解的東西可能比你想象的要難。如果你開發(fā)專門用于與你通信的信息系統(tǒng)的信息檢索服務(wù),你的思路已經(jīng)不對(duì)了,因?yàn)槟阋呀?jīng)把其他系統(tǒng)的知識(shí)歸并到系統(tǒng)中了。需求中的任何更改將會(huì)迫使雙方系統(tǒng)都作出更改。通常來講,比較好的方式是采用數(shù)量有限的檢索服務(wù)暴露系統(tǒng)數(shù)據(jù),當(dāng)檢索服務(wù)結(jié)合在一起使用時(shí),它們涵蓋了所有相關(guān)服務(wù)的信息檢索需求。例如,某個(gè)產(chǎn)品數(shù)據(jù)庫可能通過好幾個(gè)服務(wù)分別暴露出去:一個(gè)簡單的僅包含編碼、描述、部門以及產(chǎn)品定價(jià)的服務(wù)、一個(gè)暴露出所有該產(chǎn)品財(cái)務(wù)方面信息的服務(wù),以及一個(gè)暴露出所有該產(chǎn)品物流方面信息的服務(wù)。許多系統(tǒng)僅需簡單服務(wù)即可得到滿足,大部分只需要部分?jǐn)?shù)據(jù)而非全部,或財(cái)務(wù)或物流的服務(wù),而有一些兩者都需要,但此外沒有任何一個(gè)需要特別接口的系統(tǒng)。這種工作方式被稱為麥當(dāng)勞方式:客戶從標(biāo)準(zhǔn)產(chǎn)品中搭配出自己需要的產(chǎn)品。支持這種方式并不困難,因?yàn)椴还茉鯓幽愣夹枰@些服務(wù)去支持面向客戶的程序。你甚至可以用這種方式來支持非常特別的信息需求,因?yàn)槟切┎恍枰臄?shù)據(jù)可以在消費(fèi)前就過濾掉。如果不想在巨無霸漢堡中放小黃瓜,扔掉它就可以了!這種方式的基本思路是提供過多的信息要比提供過少的信息遇到的問題少,因?yàn)榻邮辗较到y(tǒng)可以很容易通過程序過濾掉不需要的信息,但是如果缺少信息那就麻煩了。
不去了解你不需要了解的東西也會(huì)使得為支持業(yè)務(wù)流程所需的信息交互大大簡化。在SOA的范式中,當(dāng)你請(qǐng)求另一個(gè)代理為你做一些事,那就是你所需要做的全部。你不需要為代理提供可能有助于完成任務(wù)的或者是其必需的額外信息。在點(diǎn)菜時(shí),確保有用于這道菜的原料是廚師的職責(zé)。你說出想要的東西,然后就可以靜候佳音了。反過來,代理會(huì)使用信息檢索服務(wù)來向你咨詢所有信息,但是檢索什么、何時(shí)檢索以及從何檢索,這些問題都應(yīng)該由他來決定,你無須去了解,更不用將該知識(shí)歸并至你的系統(tǒng)中。這樣,在他那一端的更改幾乎不需要你這邊作出更改。比如說,如果他決定停止維護(hù)對(duì)你數(shù)據(jù)的拷貝,你什么更改都不需要做。
當(dāng)然,不去了解你不需要了解的事情確實(shí)會(huì)導(dǎo)致效率低下。原本只需要一次交換即可實(shí)現(xiàn)的操作現(xiàn)在將需要多個(gè)步驟。麥當(dāng)勞方式常常會(huì)導(dǎo)致原本一個(gè)服務(wù)即可滿足卻提供了多個(gè)服務(wù)的情況,另一邊卻還在檢索信息,而這些信息又常常是冗余而非十分必要。總會(huì)出現(xiàn)一些情形,可以通過好的商業(yè)意識(shí)來優(yōu)化這些通信模式。也會(huì)有很多場合你會(huì)想要優(yōu)化用戶接口,那也只是因?yàn)楫?dāng)前的表示設(shè)備并不擅長提供給用戶吸引人的界面。但是在你優(yōu)化之前,請(qǐng)考慮你會(huì)失去什么樣的靈活性。另外絕不要想去優(yōu)化那些尚未穩(wěn)定的功能需求。
2.不要了解你還不能了解的事情
為時(shí)過早的規(guī)范凍結(jié)
數(shù)據(jù)庫范式中,一個(gè)真正的難題在于:它要求在你還未足夠了解并有能力去確定數(shù)據(jù)的具體結(jié)構(gòu)前,就去做這件事。因?yàn)樗鼈兒鲆暳艘粋€(gè)生活中簡單的事實(shí):只有當(dāng)用戶看到他們不想看到的東西時(shí),他們才知道其真正想要的是什么。
其工作原理是這樣:一旦完成了數(shù)據(jù)結(jié)構(gòu)的設(shè)計(jì),任何后續(xù)修改都會(huì)引起雜亂的數(shù)據(jù)庫轉(zhuǎn)換,除此之外每個(gè)訪問該數(shù)據(jù)庫的系統(tǒng)也會(huì)改變。所有這些改變必須都協(xié)調(diào)好,當(dāng)所有對(duì)數(shù)據(jù)庫的操作都限制在單個(gè)系統(tǒng)時(shí)候,這種協(xié)調(diào)是很困難的,但如果有多個(gè)系統(tǒng)都在操作,那就更難了,尤其是:如果其中有些系統(tǒng)被不受你控制的參與方管理的時(shí)候。事實(shí)上,在系統(tǒng)開發(fā)階段做這些更改就已經(jīng)很成問題了。其后果是,數(shù)據(jù)庫設(shè)計(jì)早在系統(tǒng)開發(fā)階段就被凍結(jié),然后數(shù)據(jù)分析師們?cè)偃ソ吡π拚@些設(shè)計(jì)。
現(xiàn)在的問題是數(shù)據(jù)分析師們面臨著不可能完成的工作。他們必須在用戶理解這個(gè)設(shè)計(jì)(且不說贊賞這個(gè)設(shè)計(jì)實(shí)際應(yīng)用如何)前就確定該設(shè)計(jì)。只有在過了很久之后——系統(tǒng)已經(jīng)構(gòu)建好之后——用戶才能對(duì)該系統(tǒng)有所體會(huì)并對(duì)其是否滿足自己的需求作出評(píng)估。如果此時(shí)發(fā)現(xiàn)數(shù)據(jù)結(jié)構(gòu)上有任何大問題,要想修復(fù)就太晚了。
SOA原型法
你可能會(huì)問:“SOA是怎么個(gè)不同尋常呢?”說到底,難道SOA不像數(shù)據(jù)庫范式那樣一樣需要結(jié)構(gòu)化數(shù)據(jù)嗎?這個(gè)問題的簡單答案:不管請(qǐng)求數(shù)據(jù)時(shí),被人工代理處理還是被自動(dòng)化系統(tǒng)處理,SOA都是管用的,并且就算數(shù)據(jù)沒有被最優(yōu)結(jié)構(gòu)化,人們還是可以解讀它。比如說,用戶可以判斷信件是否正在被發(fā)送至另一個(gè)國家,無論信件的地址是用行一、行二、行三和行四來表示的,而信息系統(tǒng)需要至少“國家”來作為數(shù)據(jù)結(jié)構(gòu)可識(shí)別的一部分。
仔細(xì)回答這個(gè)問題就包括了對(duì)SOA原型法的討論,這種討論包括以下幾方面:
識(shí)別將被構(gòu)建到系統(tǒng)中的元數(shù)據(jù)。把它放在主命名空間中,用傳統(tǒng)方式根據(jù)其結(jié)構(gòu)把數(shù)據(jù)存儲(chǔ)到數(shù)據(jù)庫管理系統(tǒng)(DBMS)。例如,用戶信息,這個(gè)元數(shù)據(jù)可能由用戶ID和用戶名構(gòu)成。因?yàn)檫@個(gè)元數(shù)據(jù)被構(gòu)建到系統(tǒng)中,所以為了使用這些字段而把邏輯也構(gòu)建到系統(tǒng)中是完全有可能的,比如通過用戶ID檢索記錄并基于用戶名排序和篩選記錄。
對(duì)每一條數(shù)據(jù)庫記錄,把不包含在主命名空間的所有數(shù)據(jù)放到一個(gè)單獨(dú)的XML字符串中,該字符串作為一個(gè)單獨(dú)的字段添加到數(shù)據(jù)庫記錄中。對(duì)每個(gè)XML字符串,構(gòu)建一個(gè)二級(jí)命名空間,開發(fā)XSD,同時(shí)添加一個(gè)單獨(dú)數(shù)據(jù)項(xiàng)到主命名空間。對(duì)用戶記錄的初步實(shí)現(xiàn)來說,這個(gè)字符串可能包括地址行一、行二、行三和行四的元數(shù)據(jù)。用戶記錄本身的XSD將會(huì)包括三個(gè)字段的元數(shù)據(jù):用戶ID、用戶名和以XML字符串包括的附加的用戶相關(guān)數(shù)據(jù)。附加用戶數(shù)據(jù)的XSD包括每條地址行的元數(shù)據(jù)。
使用基于XSD的邏輯來為數(shù)據(jù)庫記錄的各相關(guān)層次獲取及展示所有數(shù)據(jù),這可以通過給每個(gè)XML字符串(包含對(duì)主記錄的字符串)增加一個(gè)標(biāo)準(zhǔn)驗(yàn)證服務(wù)來實(shí)現(xiàn)。如有可能,利用某種工具來產(chǎn)生使用XSD的接口而不要自己去編程。該工具必須使用二級(jí)XML字符串所包含的元數(shù)據(jù)來將其解包,并且必須同時(shí)使用主、次兩級(jí)XSD的邏輯來獲取新記錄。其結(jié)果就是一個(gè)可運(yùn)行的原型,用戶可用以評(píng)估預(yù)期使用的系統(tǒng)。
要盡量適應(yīng)和修改基于XSD的邏輯以及驗(yàn)證服務(wù)直到用戶對(duì)系統(tǒng)滿意為止。就拿用戶記錄來說,一個(gè)新的針對(duì)字符串的XSD可包括以下元數(shù)據(jù):街道地址、郵編、縣市、以及國家。使用舊XSD存儲(chǔ)的數(shù)據(jù)仍會(huì)正確顯示,所以無需立即將其轉(zhuǎn)換。而使用新XSD將會(huì)獲取新的記錄。
一旦用戶和你確信元數(shù)據(jù)已經(jīng)穩(wěn)定了,那么請(qǐng)考慮把數(shù)據(jù)遷移到傳統(tǒng)的數(shù)據(jù)結(jié)構(gòu)和主命名空間。
當(dāng)然,SOA原型法并不總是必要的。當(dāng)需求受限于如此多的不確定性時(shí),請(qǐng)使用原型法,這樣先做原型然后再將其穩(wěn)定比較經(jīng)濟(jì)。但是請(qǐng)記住這個(gè)肯定要比數(shù)據(jù)庫化原型法要簡單的多。在數(shù)據(jù)庫化的時(shí)代,原型法只是可有可無,但是在SOA的時(shí)代,它便是家常便飯。不要將設(shè)計(jì)細(xì)節(jié)固定,除非你確定它們是正確的;就是這么簡單。
3.除了要求的不要多做
產(chǎn)品驅(qū)動(dòng)的服務(wù)分解
SOA主要的優(yōu)勢就是它是一個(gè)能被轉(zhuǎn)化成技術(shù)的業(yè)務(wù)概念,不像數(shù)據(jù)庫世界里那樣,技術(shù)概念總想試圖跟上業(yè)務(wù)的步伐。在SOA中,每個(gè)服務(wù)必須明確地增加價(jià)值,不只是在抽象意義層面上,而更具體地要針對(duì)那些調(diào)用方而言。發(fā)生的一切之所以這樣發(fā)生了,是因?yàn)榉?wù)請(qǐng)求者要求其如此。通過不實(shí)現(xiàn)任何服務(wù)請(qǐng)求者沒有明確要求的東西,服務(wù)可以被限定在它們的核心功能上。如果SOA中所有的參與者都積極這樣去做,那么將會(huì)使互操作性大大增加。
SOA中最高層次的服務(wù)是業(yè)務(wù)交易:某個(gè)客戶下了一個(gè)貨物或服務(wù)的訂單——除非訂單被供應(yīng)商拒絕——否則這就開始了一個(gè)訂單交付。在SOA范式中,任何從接受訂單到訂單交付之間所發(fā)生的都可以也應(yīng)該以服務(wù)的形式實(shí)現(xiàn)。為實(shí)現(xiàn)訂單交付而要求的每個(gè)中間產(chǎn)品或狀態(tài),供應(yīng)商會(huì)要求某些人或某些組織機(jī)構(gòu)——不一定是供應(yīng)商內(nèi)部的組織——來執(zhí)行交付。然后這些中間服務(wù)自身又可以分解成多個(gè)服務(wù),一直到增加價(jià)值的基本組織層面。
層次服務(wù)分解是SOA范式中非常重要的一部分,因?yàn)樗狗?wù)交付通過服務(wù)水平協(xié)議的方式管理。它可以確保每個(gè)服務(wù)都有專人負(fù)責(zé),并且服務(wù)消費(fèi)者們知道他們會(huì)得到什么。
通用的中間產(chǎn)品和通用的服務(wù)
服務(wù)分解都是關(guān)于產(chǎn)品的。只有當(dāng)組成服務(wù)的那些子服務(wù)不能立即執(zhí)行時(shí)流程才會(huì)出現(xiàn)。例如,如果決定是否接受客戶訂單的服務(wù)要求:先執(zhí)行判斷訂單價(jià)值的子服務(wù),再執(zhí)行確定客戶信用狀態(tài)的子服務(wù),那么實(shí)現(xiàn)該服務(wù)就包含了一個(gè)流程。每個(gè)這樣的流程只與一個(gè)服務(wù)相關(guān)。如果你發(fā)現(xiàn)有個(gè)流程不僅限于單個(gè)這樣的服務(wù),那么你很有可能是忘了把客戶的初始需求建模為服務(wù)了。
有可能出現(xiàn)這樣的情況,相同的中間產(chǎn)品——當(dāng)然還有相同的服務(wù)——可能會(huì)被不同的高級(jí)別產(chǎn)品需要。比如,那些要求明顯區(qū)分交付過程的商品,在中間產(chǎn)品的環(huán)節(jié),其中的差別一般來說幾乎微乎其微,中間產(chǎn)品其實(shí)也是由客戶來支付——為了從客戶那里賺取利潤,我們需要金額、日期以及讓我們可以冠冕堂皇地向客戶要求支付的條款,實(shí)際是什么則并不用去理會(huì)。在這種情況下,正常的基準(zhǔn)是如果存在通用的中間產(chǎn)品,那么它應(yīng)該由單個(gè)服務(wù)來實(shí)現(xiàn),而這個(gè)服務(wù)能夠被多個(gè)高級(jí)別的服務(wù)調(diào)用。
這種服務(wù)只有結(jié)果是重要的——不是開始——因?yàn)槭占瘜?duì)交付服務(wù)有用的信息是服務(wù)本身的一部分,而不是請(qǐng)求服務(wù)源頭的一部分。需要注意的是:是否需要單個(gè)服務(wù)是由業(yè)務(wù)決定的,和信息技術(shù)沒有任何關(guān)系。如果不管是現(xiàn)在還是相關(guān)的未來,交付相同的中間產(chǎn)品都是切實(shí)有用的,那么就應(yīng)該有單個(gè)服務(wù)。除非在現(xiàn)在或相關(guān)的未來有商業(yè)力量發(fā)揮作用使中間產(chǎn)品發(fā)生結(jié)構(gòu)性分化,那我們最好不要為每組需求分別提供相應(yīng)服務(wù)。然而事實(shí)偏偏相反。在SOA,事物是由相同走向不同,而在數(shù)據(jù)庫化的方法中,事物則是由不同走向相同。
帶有多種行為的通用服務(wù)
你可能會(huì)問,如果需要兩種完全不同的行為而你只為其提供一種服務(wù),這樣做的意義何在呢?難道我們還在被同樣困擾數(shù)據(jù)庫世界的“一刀切”做法限制?比如,如果我們出售兩種類型的產(chǎn)品,其中一種使用固定價(jià)格而另一種則根據(jù)某些復(fù)雜的公式計(jì)算出變動(dòng)價(jià)格,為什么不用兩種結(jié)算服務(wù),為每種特定的產(chǎn)品各訂制一種呢?
這些問題很好,但問錯(cuò)了地方。它們是好問題,那是因?yàn)槿魏尾荒艹浞謶?yīng)對(duì)發(fā)生在問題域內(nèi)變化的設(shè)計(jì)方法注定會(huì)失敗。但是它們問在了錯(cuò)誤的地方,這是因?yàn)楦鶕?jù)問題域中的變化來調(diào)整方案的靈活性應(yīng)該構(gòu)建到服務(wù)中,而不是圍繞著服務(wù)來構(gòu)建。就拿結(jié)算服務(wù)來說,每次調(diào)用一種方法時(shí),它應(yīng)該決定這兩種算法應(yīng)該使用哪一種。那樣的話,如果引入第三種結(jié)算算法,那么只有結(jié)算服務(wù)需要去做調(diào)整。請(qǐng)注意這并不意味著結(jié)算服務(wù)必須被設(shè)計(jì)成某種“萬能”機(jī)器;它同樣可以很好地為每個(gè)算法分別調(diào)用相應(yīng)的子服務(wù)。這種選擇——介于多功能解決方案和包含不同組件的框架之間——是一種可以根據(jù)服務(wù)來決定的選擇,因?yàn)樗恍枰环?wù)請(qǐng)求者知道。在SOA中,這種選擇更常見,但目前的做法則常常導(dǎo)致產(chǎn)生框架解決方案,因?yàn)樾枰喙δ芊桨傅母杏X在很大程度上是由于不能從那些需要執(zhí)行的信息里識(shí)別出服務(wù)請(qǐng)求造成的。這種需要高素質(zhì)專家來實(shí)現(xiàn)的帶有如此多參數(shù)的以一應(yīng)十的多功能方案的日子不會(huì)長久了。
堅(jiān)持要點(diǎn)
流程驅(qū)動(dòng)方法也可以使我們分清我們是代表服務(wù)請(qǐng)求者做事還是為自己做事。以服務(wù)請(qǐng)求者身份做的事應(yīng)該作為服務(wù)的一部分來執(zhí)行,而其余的就不應(yīng)該了。通過這種區(qū)分,我們可以讓服務(wù)盡可能簡單,這樣可以在不需要改變各式各樣其他東西的情況下替換掉該服務(wù)。舉例來說,我們會(huì)生產(chǎn)產(chǎn)品來滿足外部服務(wù)請(qǐng)求,但是維護(hù)簿記系統(tǒng)是為了滿足我們自己的需求,而不是請(qǐng)求者的。如果要開發(fā)一項(xiàng)服務(wù)將客戶訂單轉(zhuǎn)變成制造活動(dòng)及賬目簿記,那么只要我們實(shí)現(xiàn)一個(gè)新的簿記系統(tǒng),我們就要去修改一次這個(gè)服務(wù)。這聽起來似乎還不是太糟糕,但試想一下所有事情都是為我們自己而做,那就太糟糕了。包含最新數(shù)據(jù)的數(shù)據(jù)倉庫的簿記、日志、儲(chǔ)存、員工績效數(shù)據(jù)的維護(hù):所有這些及其他事情一般都由系統(tǒng)完成,這些系統(tǒng)隨組織機(jī)構(gòu)和時(shí)間的不同而不同,因此在業(yè)務(wù)服務(wù)中包含這些知識(shí)會(huì)降低互操作性,增加了用其他系統(tǒng)來實(shí)現(xiàn)服務(wù)替換的難度。我們可以通過產(chǎn)生通知的方式來避免此類問題,即:如果對(duì)這些功能很重要的事情發(fā)生了,就發(fā)出通知,然后它們可以使用通用服務(wù)檢索處理事件所需的信息。
另一類不應(yīng)作為服務(wù)一部分執(zhí)行的業(yè)務(wù)活動(dòng)包括那些一旦服務(wù)請(qǐng)求被撤銷就無法逆轉(zhuǎn)的活動(dòng)。通常來說,這類活動(dòng)包括諸如因客戶訂貨導(dǎo)致庫存量低于補(bǔ)貨水平從而需要訂購補(bǔ)給、注冊(cè)新用戶以及更新現(xiàn)有用戶信息。這些活動(dòng)是整個(gè)流程中的各個(gè)步驟,應(yīng)使用單獨(dú)的服務(wù)一一執(zhí)行。
當(dāng)然,這種思維方式可以與數(shù)據(jù)庫范式緊密結(jié)合。但并不是其所特有的,因?yàn)樗cSOA有關(guān)。結(jié)果是,許多SOA的實(shí)現(xiàn)與數(shù)據(jù)庫化的思維方式背道而馳,而正是這種思維方式激發(fā)了他們以自下而上的方式識(shí)別服務(wù),而非SOA的自上而下方式。在自下而上方式中,原本一開始為某個(gè)問題開發(fā)的服務(wù)也可以為其他問題復(fù)用,這多虧了設(shè)計(jì)它的人對(duì)于如何更廣泛地應(yīng)用做了認(rèn)真的思考。SOA中,在多個(gè)上下文中使用某個(gè)服務(wù)是縝密設(shè)計(jì)的結(jié)果,而不是靠直覺,并且從設(shè)計(jì)之初就將所有那些上下文都考慮了進(jìn)來。說到復(fù)用某一服務(wù)來交付某一通用的中間產(chǎn)品就好比說重復(fù)使用前門進(jìn)入房子,不管那扇門是通向客廳、廚房,還是衛(wèi)生間。你能想象廚房設(shè)計(jì)師說:“真妙!那家伙設(shè)計(jì)的室外通向客廳的入口正好可以被我用來作為通向廚房的室外入口!”嗎?任何談?wù)摗皬?fù)用”(如復(fù)用支付服務(wù))的人都還沒有實(shí)現(xiàn)它。請(qǐng)注意,這并不是錯(cuò)誤的,只是有點(diǎn)奇怪和沒有什么啟發(fā)性罷了。
服務(wù)遵從業(yè)務(wù)
采用SOA方式思考問題的一個(gè)結(jié)果就是SOA會(huì)使得服務(wù)依據(jù)其業(yè)務(wù)意義而非機(jī)械的實(shí)現(xiàn)來表述。例如,名為增加用戶記錄的服務(wù)是數(shù)據(jù)庫化的,而名為注冊(cè)新用戶的服務(wù)就是SOA的,即便這兩個(gè)服務(wù)做的事情完全一樣。我們對(duì)服務(wù)的命名十分重要,因?yàn)樗嬖V我們是誰在請(qǐng)求該服務(wù),以及為什么他要請(qǐng)求這項(xiàng)服務(wù)。在這個(gè)特定的例子中,SOA自上而下的方法會(huì)得到一個(gè)結(jié)論,那就是業(yè)務(wù)流程需要一個(gè)有效的用戶注冊(cè)服務(wù),該服務(wù)通過修改現(xiàn)存的注冊(cè)服務(wù)(如果有的話)來完成,而不是重新自動(dòng)創(chuàng)建一個(gè)新的。在SOA中,這是用戶注冊(cè)服務(wù)的責(zé)任,而數(shù)據(jù)庫化的方法卻會(huì)把這個(gè)責(zé)任推到服務(wù)請(qǐng)求者身上。類似地,SOA注冊(cè)用戶服務(wù)自身會(huì)決定用戶ID是什么,而數(shù)據(jù)庫化的服務(wù)可能就會(huì)干脆讓服務(wù)請(qǐng)求者做這個(gè)決定。
匯聚到單個(gè)方案
總的看來,SOA由上至下的思維方式使得很多設(shè)計(jì)決策只存在一個(gè)選項(xiàng),而數(shù)據(jù)庫化的思考者會(huì)把該選項(xiàng)僅僅看作眾多可選方案之一。這是SOA很重要的一個(gè)優(yōu)勢,考慮到SOA是以互操作性為導(dǎo)向的,而互操作性要求我們行車時(shí)都在同一邊行駛而不用去和我們碰到的每輛車去交涉。那些忽視這點(diǎn)的人--比如通過主張Web服務(wù)只是眾多實(shí)現(xiàn)跨系統(tǒng)邊界SOA的一種方式--能夠一直成功的機(jī)會(huì)和那些只考慮下一步的棋手差不多。誠然,總是有比Web服務(wù)更簡單的方法去連接兩個(gè)系統(tǒng),但是為了讓呼叫中心或輸出管理設(shè)施能使用相同數(shù)據(jù)你會(huì)怎么做?為了確保數(shù)據(jù)倉庫能夠在你把事件從一個(gè)系統(tǒng)轉(zhuǎn)換到另一個(gè)系統(tǒng)時(shí)得到通知,或者事件一發(fā)生便能及時(shí)通知你的客戶,你又會(huì)怎么做呢?在SOA的世界里,數(shù)據(jù)和事件必須在多個(gè)系統(tǒng)中可用,而Web服務(wù)是能夠確保在低投資和低維護(hù)成本的前提下達(dá)到這一效果的最有效的方法。
存在這一明顯差異的一個(gè)領(lǐng)域就是電子數(shù)據(jù)交換(EDI)。傳統(tǒng)的電子數(shù)據(jù)交換(EDI)技術(shù)旨在確定組織之間通信可能需要的信息,并為該信息定義詞匯。那和定義某一特定的信息交互不是一回事。比如,你可以使用相同的EDI報(bào)文來下訂單、查詢其進(jìn)展以及修改它。兩個(gè)組織想通過這些規(guī)范進(jìn)行通信必須坐下來一起就這一詞匯的使用方式達(dá)成一致。SOA分離了這些關(guān)注點(diǎn):詞匯由命名空間來處理,而這些命名空間可能會(huì)被多個(gè)服務(wù)使用,每個(gè)服務(wù)有各自特定的目的。
“SOA由上至下方式導(dǎo)致更具體的結(jié)論”的另一領(lǐng)域是這樣一個(gè)問題:是什么筑起了一個(gè)編排過的流程邊界。通常,這個(gè)問題會(huì)引起無休止的爭論。比如,采用輸出管理服務(wù)給客戶發(fā)送確認(rèn)信息是否應(yīng)被編排為用戶流程的一部分,如果是的話,它應(yīng)該采用即發(fā)即棄(fire-and-forget)的方式處理還是應(yīng)該由輸出管理服務(wù)來報(bào)告動(dòng)作成功完成?按SOA的話講,所有這些東西都是用戶意圖的一部分,因此都應(yīng)該被編排的。其他一些行為,比如考慮到新用戶訂單的更新數(shù)據(jù)倉庫或者更新總分類,很顯然都不是用戶意圖的一部分,不應(yīng)該包含在流程編排中,哪怕它們是同一方執(zhí)行的。
4.不要自己做瑣事
通用功能
業(yè)務(wù)服務(wù)應(yīng)該只包含特定于該服務(wù)的那些功能邏輯。它應(yīng)該把其他功能都委托出去。那樣的話,服務(wù)自身就可以盡可能簡單。這使得設(shè)計(jì)、測試以及替換服務(wù),如有必要的話,更容易。這是個(gè)基本的數(shù)學(xué)知識(shí):新軟件模塊需要匹配的因素越多,那么同價(jià)位下的成品軟件(COTS)的共性越少,而且若恰好有個(gè)方案可用時(shí)它也會(huì)更貴。如果可以將這些非特定功能委托給標(biāo)準(zhǔn)服務(wù),那么就可以降低需要匹配的因素個(gè)數(shù)。
服務(wù)可以代勞的首要任務(wù)是瑣事:都是些“家務(wù)事”而非真正業(yè)務(wù)相關(guān)的功能。這些瑣事天生就是普遍的,換句話說完成這些瑣事的方式并不是為支持業(yè)務(wù)上下文的服務(wù)量身定制的。
通用用戶接口
當(dāng)你得知信息系統(tǒng)最不應(yīng)該做的一大瑣事就是管理用戶體驗(yàn)時(shí)你可能會(huì)覺得驚訝。這是一個(gè)通用的功能,應(yīng)該盡可能的采用標(biāo)準(zhǔn)工具來處理。用戶體驗(yàn)包括用戶可以選擇要執(zhí)行工作項(xiàng)的工作列表,工作項(xiàng)執(zhí)行的工具——比如通過啟動(dòng)一個(gè)用戶界面(如果有的話)來關(guān)閉已完成的工作項(xiàng)。它包含了用戶有可能執(zhí)行的交易甄選,輸入信息屏幕的表示——一般是從XSD生成——以及使用和交易相對(duì)應(yīng)的標(biāo)準(zhǔn)驗(yàn)證服務(wù)進(jìn)行驗(yàn)證。它包括了保持當(dāng)前用戶上下文環(huán)境,這樣他就無需再次輸入當(dāng)前的客戶、產(chǎn)品、項(xiàng)目、流程實(shí)例或者其他任何東西,而是可以使用這些默認(rèn)值或者在必要時(shí)候重寫它們。它包括了和當(dāng)前用戶上下文環(huán)境相關(guān)的所有文檔的介紹。它包含了用戶可能需要作出響應(yīng)的提示對(duì)話框。
所有這些東西都可以使用無需包含任何業(yè)務(wù)知識(shí)的工具實(shí)現(xiàn)。總的來說,給用戶提供一個(gè)統(tǒng)一、包含所有東西的環(huán)境遠(yuǎn)比為某個(gè)特定行為而優(yōu)化的用戶界面要好。如果有業(yè)務(wù)案例違背了這一原則,請(qǐng)至少記住這點(diǎn):在穩(wěn)定用戶界之前,不要去優(yōu)化它。
典型通用功能
其他的瑣事還包括,但并不僅限于以下幾個(gè)方面:
安全:建立服務(wù)請(qǐng)求者身份和訪問權(quán)限。
通知:確認(rèn)某一業(yè)務(wù)事件應(yīng)通知哪些人。這包括了維護(hù)基于此的事件訂閱。
輸出管理:在線下進(jìn)行信息通信,而不是作為一種服務(wù)響應(yīng)。典型例子就是當(dāng)客戶請(qǐng)求必須被正式確認(rèn)時(shí),比如使用電子郵件來確認(rèn)你剛剛通過瀏覽器所做的網(wǎng)上采購。對(duì)那些主動(dòng)提供的消息也是需要的,比如每月的賬單。輸出管理必須決定通過哪條渠道去發(fā)送信息,以及使用哪個(gè)地址來發(fā)送。它應(yīng)該把消息轉(zhuǎn)換成接收方能夠接收的格式,發(fā)送消息,并把消息添加到歸檔文檔。輸出管理包括維護(hù)那些被用來將數(shù)據(jù)轉(zhuǎn)換成用戶可理解消息的模板,以及潛在接收者的地址和渠道偏好。
數(shù)據(jù)轉(zhuǎn)換:把數(shù)據(jù)從一種格式轉(zhuǎn)換為另一個(gè),把獨(dú)立的各個(gè)服務(wù)打包為一個(gè)服務(wù)——用麥當(dāng)勞的說法,開心樂園餐——以及分解拆包,將服務(wù)請(qǐng)求拆分成適用于不同人群的各個(gè)獨(dú)立請(qǐng)求,匯集各個(gè)回應(yīng),排隊(duì)及出列,或協(xié)議轉(zhuǎn)換。
流程編排:編排某一流程,以確保按適當(dāng)順序且僅相關(guān)時(shí)來執(zhí)行那些組成流程的服務(wù),確??煲馄跁r(shí)發(fā)送告警信息,以及確保因輔助信息或者逾期打斷從而引起的新流程分支被啟用。
歸檔管理:維護(hù)及訪問相關(guān)的歸檔信息。這些可能是虛擬的檔案,從某種意義上是展現(xiàn)給用戶的信息,當(dāng)他需要某個(gè)檔案時(shí)可以使用查詢來檢索。對(duì)那些從數(shù)據(jù)庫中抽取的內(nèi)容,這被認(rèn)為是正常的,但是沒有特殊理由不對(duì)文檔使用相同的方法。在某些情況下應(yīng)使用設(shè)備來特別增加指派文檔至檔案中。
記錄管理:維護(hù)那些不允許被更改的信息。
至下而上敘述
這些實(shí)現(xiàn)瑣事的服務(wù)不能形成業(yè)務(wù)服務(wù)層次的部分。不能使用自上而下的方式去設(shè)計(jì)它們,因?yàn)檫@些服務(wù)都沒有所謂的“上”。對(duì)這樣的服務(wù),使用旨在實(shí)現(xiàn)最大程度重用的自下而上的方法會(huì)更適合。這使得從這個(gè)階段起就能夠?qū)崿F(xiàn)服務(wù)的優(yōu)勝劣汰。
采用數(shù)據(jù)庫化的方法,很少能夠?qū)嶋H把次等通用功能用更好的替換,因?yàn)檫@要求修改所有使用該方法的應(yīng)用。使用SOA則不同,這種替換很簡單,前提是已經(jīng)應(yīng)用了“不去了解你不需要了解的事情”這條規(guī)則,包括其推論:服務(wù)請(qǐng)求不應(yīng)該包含超過指定該請(qǐng)求必要信息之外的其他信息,而且服務(wù)本身應(yīng)該在需要時(shí)主動(dòng)要求更多信息。如授權(quán)服務(wù),該服務(wù)由某應(yīng)用調(diào)用,旨在決定是否允許某特定用戶在某客戶數(shù)據(jù)上執(zhí)行某項(xiàng)功能——比如說:“我們的雇員Donald Jones是否被授權(quán)可以訪問Acme Widgets company公司相關(guān)的財(cái)務(wù)數(shù)據(jù)?”。服務(wù)的簡單版本可能具備處理某些特定情況的能力,在此特定情形下可以通過使用雇員功能對(duì)應(yīng)表來回答這些問題。稍微復(fù)雜一點(diǎn)的版本可能會(huì)識(shí)別出Donald Jones屬于某個(gè)或多個(gè)組的成員,除了個(gè)人權(quán)限外還擁有該組的權(quán)限。再更近一步,授權(quán)服務(wù)可能會(huì)使用用戶證書去區(qū)別雇員和客戶,并允許客戶只能夠訪問他們自己的數(shù)據(jù)。一個(gè)完善的版本可能會(huì)使用標(biāo)準(zhǔn)化的服務(wù)去調(diào)用業(yè)務(wù)流程管理系統(tǒng)或者項(xiàng)目管理系統(tǒng),詢問Donald Jones是否已經(jīng)被賦予了任何我們和Acme Widgets交易相關(guān)的職責(zé)。更好的做法是,授權(quán)服務(wù)會(huì)記錄請(qǐng)求和應(yīng)答的日志,而簡單的版本不會(huì)這樣做。組織可以從一個(gè)服務(wù)的版本切換到另一個(gè)而無需對(duì)調(diào)用服務(wù)的應(yīng)用做任何改變。
也有可能設(shè)計(jì)出根據(jù)操作必需的條件自動(dòng)配置自己的通用服務(wù)。例如,授權(quán)服務(wù)可以檢查是否有服務(wù)可以告知它員工對(duì)某些特定客戶有職責(zé),并在該服務(wù)不可用的情況下決定只使用個(gè)人還是群組的訪問權(quán)限。用這種方式,服務(wù)可以在很多組織之間復(fù)用。
5.不要在測試上自尋煩惱
為什么SOA更容易測試
對(duì)SOA缺點(diǎn)的一種看法是測試?yán)щy。這種看法完全不恰當(dāng),原因有很多。
首先,在SOA中使用元數(shù)據(jù)可以避免錯(cuò)誤被植入到系統(tǒng)中??梢栽谠獢?shù)據(jù)層次就對(duì)系統(tǒng)進(jìn)行驗(yàn)證,例如,保證所有需要處理的數(shù)據(jù)在使用前就被匯總并校驗(yàn)。在整個(gè)業(yè)務(wù)流程范圍內(nèi)都可以實(shí)現(xiàn)這點(diǎn)。當(dāng)你可以驗(yàn)證設(shè)計(jì)的時(shí)候就不要測試整個(gè)系統(tǒng)。
其次,幾乎所有測試,包括所有系統(tǒng)集成測試,一旦測試基準(zhǔn)被建立后都可以自動(dòng)完成。但是,需要一些前提條件。表現(xiàn)層和業(yè)務(wù)執(zhí)行層必須被嚴(yán)格的區(qū)分。好在這是使用SOA的一種很自然的方式。對(duì)所有輸入,都應(yīng)該存在相應(yīng)的XSD。使用該XSD,可以生成測試記錄。同理,也可以生成帶有預(yù)期輸出結(jié)果的測試記錄。在測試過程中,不能產(chǎn)生可以證明系統(tǒng)運(yùn)行正常的任何輸出地方,必須在測試腳本中添加專門為此生成的附加輸出的查詢語句。當(dāng)測試開始運(yùn)行時(shí),測試記錄被一條條輸入系統(tǒng),然后輸出的結(jié)果自動(dòng)和期望的結(jié)果進(jìn)行對(duì)比。這會(huì)產(chǎn)生一個(gè)異常列表,其中每項(xiàng)都應(yīng)仔細(xì)考慮。測試可以按需進(jìn)行。自然,測試的結(jié)果可能取決于存積在數(shù)據(jù)庫中的數(shù)據(jù),所以這點(diǎn)需要進(jìn)行彌補(bǔ)。而且,系統(tǒng)不可表現(xiàn)出時(shí)間相關(guān)的行為。系統(tǒng)必須有能力響應(yīng)每隔一段時(shí)間(它對(duì)自動(dòng)化測試序列更適合)就產(chǎn)生的事件,而不是花上一周時(shí)間去等待某個(gè)基于時(shí)間的觸發(fā)器被觸發(fā)。用戶界面的測試應(yīng)該單獨(dú)進(jìn)行,而且永遠(yuǎn)不在集成測試中使用。
第三,SOA的設(shè)計(jì)趨向于產(chǎn)生更加健壯的系統(tǒng):系統(tǒng)出錯(cuò)的機(jī)會(huì)更少。SOA減少了信息系統(tǒng)為了協(xié)同工作而需要達(dá)成協(xié)議的因素?cái)?shù)量,這樣一來,導(dǎo)致在某關(guān)鍵因素上產(chǎn)生分歧的設(shè)計(jì)錯(cuò)誤的概率也減少了。就算真的出錯(cuò),也能夠在造成損害之前檢測到。使用SOA,消息在被處理前會(huì)被驗(yàn)證,這樣可以判斷消息是否格式正確、是否符合相應(yīng)的XSD。
可行性測試
最后,作為數(shù)據(jù)庫時(shí)代特有的產(chǎn)物——測試環(huán)境和生產(chǎn)環(huán)境必須嚴(yán)格區(qū)分,從此不再需要了,而且有時(shí)候這也是不適合的。這是很有可能的,這是因?yàn)槲覀儾辉賹?shí)際進(jìn)行系統(tǒng)測試了,而是對(duì)測試通路和信息處理的方式進(jìn)行測試。SOA提供了三重安全的、有效區(qū)分測試消息和生產(chǎn)消息的方法。除了被封裝好的消息,其他每個(gè)消息自身和相應(yīng)的命名空間都包含版本號(hào)。而且每個(gè)消息都包含一個(gè)標(biāo)簽用以指示它是用于測試還是生產(chǎn)。所需的只是一個(gè)SOA網(wǎng)關(guān),它存在于防火墻內(nèi)部,對(duì)每條進(jìn)入消息進(jìn)行如下處理:
校驗(yàn)消息以確定其是否與一個(gè)已知XSD的版本相符(被封裝好的消息除外)。
使用我們對(duì)相應(yīng)XSD的副本對(duì)消息進(jìn)行校驗(yàn),以確定其是否有效。
如果消息用于生產(chǎn)的,就驗(yàn)證消息版本號(hào)是否被允許用于生產(chǎn)。只有這樣,消息才能夠被傳遞到生產(chǎn)系統(tǒng)。其他所謂的“生產(chǎn)”消息都會(huì)被拒絕。
如果消息用于測試,消息可能會(huì)被傳遞到指定的測試版系統(tǒng)。在特殊情況下,消息如果只是用來做數(shù)據(jù)檢索,那也有可能被傳遞到生產(chǎn)系統(tǒng)。
只有在消息被完全測試過后,生產(chǎn)版本的注冊(cè)庫和XSD才能得以更新。
這樣的處理方法不僅僅只是三重安全的,而且使得消息的路由能以一種合乎實(shí)際的方式得到測試。這也大大降低了從測試系統(tǒng)切換到生產(chǎn)系統(tǒng)時(shí)重新進(jìn)行配置的需求。因?yàn)檫@種重新配置天生就是不可測試的,常常成為錯(cuò)誤的根源。發(fā)布經(jīng)理只能通過在半夜或者周末發(fā)布新的版本軟件來彌補(bǔ)這類錯(cuò)誤;這樣,就算新版本出現(xiàn)了任何錯(cuò)誤,也可以在有人發(fā)現(xiàn)錯(cuò)誤之前恢復(fù)到老版本。但如果這樣的變化影響到了其他組織那就沒有辦法這樣操作了。SOA發(fā)布管理要簡單得多!
我們對(duì)于SOA測試的一般認(rèn)識(shí)是時(shí)候該改變了。SOA是能夠把測試需求和設(shè)置測試的工作減少到最低的一種方案。它能使重要測試更自動(dòng)化的完成,結(jié)果也更好。
完善之理論
SOA使得信息系統(tǒng)的開發(fā)和部署能夠比使用數(shù)據(jù)庫化的方法支持更為豐富的用戶體驗(yàn)。這樣的系統(tǒng)能夠涵蓋更多的信息格式、更廣的行為集合,其行為上也可以達(dá)到更高層次的統(tǒng)一和一致以及更加可靠,不管是從客戶還是從組織內(nèi)關(guān)注合規(guī)的人員的觀點(diǎn)來衡量。然而,要想獲得這些好處需要我們跟已有的數(shù)據(jù)庫方法實(shí)踐說再見。
6.始終信守你的諾言
為什么數(shù)據(jù)庫不能一直信守諾言
接收一個(gè)服務(wù)請(qǐng)求的動(dòng)作是通過定義一個(gè)承諾,即向請(qǐng)求者承諾服務(wù)請(qǐng)求會(huì)被執(zhí)行,來確定的。這種執(zhí)行定義了一個(gè)流程,其至少包含一個(gè)步驟,但通常是多個(gè)步驟。
數(shù)據(jù)庫化的思考和流程不能融洽相處。從它們各自的本質(zhì)來看,數(shù)據(jù)庫就像是一個(gè)個(gè)孤島。而孤島會(huì)促使偏狹地思考問題:任何孤島之外的東西都不重要??梢酝ㄟ^數(shù)據(jù)庫中的事務(wù)概念來形象地解釋這個(gè)問題:某個(gè)工作單元把數(shù)據(jù)庫從一種一致性狀態(tài)轉(zhuǎn)移到另一個(gè)。在一些特殊的情況下,該概念可能會(huì)被擴(kuò)展到多個(gè)數(shù)據(jù)庫,雖然可以通過兩階段提交技術(shù)來做,但這也有局限性。邏輯一致性可能需要貫穿整個(gè)業(yè)務(wù)流程得以維護(hù),而不只是恰好在某個(gè)時(shí)刻;需要在信息改變波及的所有地方去維護(hù),其中不僅包括數(shù)據(jù)庫還有流程管理系統(tǒng)、信息以及發(fā)送和接受信息的人工代理,而這一切從數(shù)據(jù)庫世界的觀點(diǎn)看來是完全陌生的。
SOA交易概念
對(duì)數(shù)據(jù)庫世界陌生的東西對(duì)與SOA來說卻是再自然不過了。業(yè)務(wù)交易——實(shí)現(xiàn)它的一般是一個(gè)流程——就是服務(wù)。為了理解SOA何以能很好支持邏輯一致性需求,理解業(yè)務(wù)交易的需要很重要。業(yè)務(wù)交易由下面元素組成:
廠商給客戶提供信息,客戶據(jù)此可作出采購決定。一般來說,這種信息包括出售商品和服務(wù)的屬性、得到該商品的條件——包括,當(dāng)然,價(jià)格——以及可用性。從法律的角度,廠商所描述的這一信息是真實(shí)的。
用戶基于廠商描述的信息下采購訂單。
廠商核實(shí)該采購決定依據(jù)的信息是否仍然適用,如果是,則確認(rèn)該訂單。如果有變化——可能由于產(chǎn)品或服務(wù)已終止,或產(chǎn)品已經(jīng)漲價(jià),也可能是貨物或服務(wù)的規(guī)格已經(jīng)變更——那么需要一些處理來決定到底應(yīng)該如何做:是不管三七二十一繼續(xù)提交訂單,還是通過協(xié)商修改訂單,或者干脆取消訂單。
廠商和客戶雙方履行采購協(xié)議中各項(xiàng)條約。
SOA怎樣維持一致性
SOA通過多種方法維護(hù)業(yè)務(wù)交易的邏輯一致性。第一,所有暗含對(duì)前一個(gè)狀況改變的通信都要使用能夠保證消息安全交付的協(xié)議來完成。只要廠商或用戶做出某個(gè)承諾,為實(shí)現(xiàn)該承諾所要做的動(dòng)作就應(yīng)該包含這樣的改變。這樣的話,客戶和廠商就不可能對(duì)當(dāng)前業(yè)務(wù)狀態(tài)持有不同的看法了。
第二,數(shù)據(jù)庫的邏輯一致性和流程管理系統(tǒng)中處理過程的記錄可以通過兩階段提交協(xié)議來維護(hù)??缍鄠€(gè)數(shù)據(jù)庫的邏輯一致性通過一連串這樣的兩階段提交維護(hù)。首先讓數(shù)據(jù)庫A和流程管理系統(tǒng)同步,然后流程管理系統(tǒng)再和數(shù)據(jù)庫B同步,以此類推。
第三,從廠商給客戶展示產(chǎn)品到訂單下達(dá)期間,廠商面對(duì)的任何改變都可以使用樂觀鎖并發(fā)控制機(jī)制來處理。這種處理方式對(duì)SOA來說很自然:判斷是否存在相應(yīng)改動(dòng)的過程可以完全自動(dòng)化。因?yàn)镾OA使得數(shù)據(jù)在被用來作決定的同時(shí)也可以進(jìn)行訪問,找不到樂觀鎖而需要人工介入的情況幾乎鮮有發(fā)生。
最后,一筆交易的中止——比如說用戶撤銷了訂單,原因可能是用戶沒有能力支付,或者用戶去世了——使用SOA可以相對(duì)容易地處理。因?yàn)樵诮灰咨舷挛闹惺褂没虍a(chǎn)生的記錄可以被清晰地識(shí)別,所以可以確定需要哪些補(bǔ)償信息用以糾正用戶和廠商的不同認(rèn)知。因?yàn)槟膫€(gè)數(shù)據(jù)庫更新和該交易有直接關(guān)系是很清楚的,在數(shù)據(jù)庫中的哪些變更需要使用補(bǔ)償交易服務(wù)做回滾也很清楚。假設(shè),交易中止的發(fā)生相對(duì)不那么頻繁,使這些活動(dòng)完全自動(dòng)化通常是高投入低產(chǎn)出的,但是你的設(shè)計(jì)必須要考慮到這些。
請(qǐng)注意業(yè)務(wù)交易的范圍限制在那些為了處理某個(gè)服務(wù)請(qǐng)求而直接完成的操作。在SOA中,編排你自己的流程并提供事件通知給他人,是一條守則。如果服務(wù)中止了,那么有必要發(fā)通知用戶這一個(gè)變化。至于他們要怎么處理,則完全是他們自己的事。
也請(qǐng)注意,創(chuàng)建用戶服務(wù)請(qǐng)求的內(nèi)容,嚴(yán)格說起來,應(yīng)該在流程處理之前進(jìn)行,而不應(yīng)該作為流程處理的一部分。這真的不是你該做的事:原則上,提供消息的XSD和消息驗(yàn)證服務(wù)給用戶就夠了,讓他決定是從鍵盤錄入數(shù)據(jù)還是從他自己的信息系統(tǒng)以某種方式直接生成數(shù)據(jù)。對(duì)消費(fèi)者來說,這并不是——尚未成為——一個(gè)可行的方法,但采集數(shù)據(jù)和處理數(shù)據(jù)是兩件獨(dú)立的事情,并使用不同工具在各自的環(huán)境中執(zhí)行這些事情,對(duì)于這一點(diǎn)仍然是有效的。同樣是數(shù)據(jù)采集,有很多實(shí)現(xiàn)方式,這取決于用戶的期望以及他們和你溝通的渠道,但不管怎樣都應(yīng)該只有一個(gè)服務(wù)去處理這事兒。
7.不要將自己禁錮于模型
數(shù)據(jù)庫只是模型,SOA代表更多
領(lǐng)域模型是領(lǐng)域本身的體現(xiàn),操作領(lǐng)域模型要比直接操作領(lǐng)域更簡單。絕大多數(shù)的數(shù)據(jù)庫都是模型。它們以這樣一種方式代表一些管理的、物理的或者社會(huì)的領(lǐng)域:相關(guān)領(lǐng)域的問題都可以通過查詢數(shù)據(jù)庫來得到答案,而存在于領(lǐng)域中所需的行為可以從數(shù)據(jù)庫內(nèi)部得到指示。比如說,通過訪問數(shù)據(jù)庫查詢用戶的地址信息要比跟隨用戶到他家然后抄下他所進(jìn)房子的門牌號(hào)要方便的多。而且,在數(shù)據(jù)庫中對(duì)記錄進(jìn)行計(jì)數(shù)也要比清點(diǎn)一個(gè)城市有多少人或倉庫里有多少產(chǎn)品要容易。原則上,提供對(duì)這些功能的支持足以確定數(shù)據(jù)庫的數(shù)據(jù)結(jié)構(gòu)。盡管這樣,因?yàn)橐话悴惶赡苁孪染湍苊鞔_所有這些功能,所以我們使用數(shù)據(jù)建模技術(shù)對(duì)領(lǐng)域中感興趣的對(duì)象進(jìn)行分析,包括對(duì)象之間的關(guān)系,以及信息項(xiàng)(它們會(huì)告訴我們關(guān)于其自身的一些我們可能想知道的東西)。例如,若數(shù)據(jù)庫和用戶有關(guān),那么每個(gè)用戶通常都應(yīng)該存在對(duì)應(yīng)的數(shù)據(jù)庫記錄,包括一些數(shù)據(jù)庫使用者感興趣的與用戶相關(guān)的信息。因?yàn)閿?shù)據(jù)模型更多是基于功能上的考慮而不是某些特定數(shù)據(jù)庫的使用,所以將數(shù)據(jù)結(jié)構(gòu)建立在這種模型之上會(huì)使數(shù)據(jù)庫能夠更易適應(yīng)各種未預(yù)見的需求。數(shù)據(jù)庫在語義上被結(jié)構(gòu)化了;換句話來講,數(shù)據(jù)庫是根據(jù)其表達(dá)出的意思來構(gòu)造的。
對(duì)沒有實(shí)現(xiàn)數(shù)據(jù)模型的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫技術(shù)就沒那么方便了。它實(shí)在不能在描述、文本、圖像等方面做很多貢獻(xiàn)。相反,SOA卻能夠很好地處理文檔、記錄,就像可以很好處理那些根據(jù)數(shù)據(jù)模型構(gòu)建的數(shù)據(jù)一樣。SOA允許單個(gè)設(shè)計(jì)能夠處理語義結(jié)構(gòu)化信息和文檔。盡管如此,由于數(shù)據(jù)庫系統(tǒng)支配了我們的思維模式,所以當(dāng)應(yīng)用SOA時(shí)免不了很自然的會(huì)堅(jiān)持其局限性。但是在SOA的世界里不存在特殊的理由要去應(yīng)用這種限制,任何理由都不能夠這樣做。
超越模型的益處
將語義上結(jié)構(gòu)化的數(shù)據(jù)和一些像超鏈接、文本、圖片以及音頻片段的東西結(jié)合起來的一個(gè)主要原因是創(chuàng)建更為豐富的用戶體驗(yàn)。對(duì)消費(fèi)者來說,這是必須的,而不是可選的。對(duì)你雇傭的知識(shí)型工作人員而言,這會(huì)使他們做事更有效率。只有對(duì)從事日常管理的員工來說,它才會(huì)成為一種障礙。然而你應(yīng)用SOA越多,你對(duì)這些人員的需要就越少。他們從表單鍵入數(shù)據(jù)的工作可以外包給任何人做:你需要做的僅僅是掃描每個(gè)表單然后把圖像發(fā)送給代理,代理本質(zhì)上使用和用戶一樣的Web表單去鍵入數(shù)據(jù)。至少真正需要雇員日常處理的工作都可以用自動(dòng)化完成。
不要讓自己禁錮于數(shù)據(jù)庫數(shù)據(jù)的第二大原因是,把數(shù)據(jù)庫化和基于文本的數(shù)據(jù)結(jié)合起來是目前維持營運(yùn)合規(guī)所需記錄信息和審計(jì)線索最簡單的方法。數(shù)據(jù)庫因其特有的性質(zhì)并不適合這樣的最終目的。因?yàn)橥ǔD硞€(gè)數(shù)據(jù)庫是為擔(dān)當(dāng)某種管理現(xiàn)狀模型而構(gòu)建的,所以當(dāng)該管理現(xiàn)狀改變的時(shí)候,它應(yīng)該很容易去做相應(yīng)改變。數(shù)據(jù)庫管理系統(tǒng)就是為了方便這種改變而設(shè)計(jì)的。當(dāng)它們被用來維護(hù)不允許被更改的記錄時(shí)——比如,簿記條目——設(shè)計(jì)者不得不把各種安全防御構(gòu)建到系統(tǒng)中,從而防止對(duì)記錄的惡意操作。即便如此,神智清醒的外行人也不會(huì)去信任數(shù)據(jù)庫的。為營運(yùn)合規(guī)目的需要的記錄信息和審計(jì)線索必須被委托給記錄管理程序,然后通過SOA來與數(shù)據(jù)庫系統(tǒng)進(jìn)行關(guān)聯(lián)。
使用SOA,把語義結(jié)構(gòu)化的數(shù)據(jù)和其他形式的信息表示連接起來很容易。這使得它是內(nèi)容管理和內(nèi)容表示的理想之選。數(shù)據(jù)庫可以將超鏈接保存到其他信息中。比如,我們可以用交易的數(shù)據(jù)庫記錄來存儲(chǔ)產(chǎn)生該交易的輸入文檔的超鏈接。當(dāng)顯示交易記錄的同時(shí),鏈接也跟著展現(xiàn),而且可以讓使用者通過單獨(dú)的服務(wù)去激活它。開發(fā)一個(gè)使其能夠從歸檔文件去訪問文檔的服務(wù)不會(huì)比開發(fā)一個(gè)從數(shù)據(jù)庫訪問數(shù)據(jù)的服務(wù)更困難。當(dāng)然了,除非你的歸檔文件不具有SOA能力,此時(shí)第一件要做的事情就是替換掉它。
但是,反過來也一樣。不僅語義格式化的數(shù)據(jù)通過鏈接來豐富記錄,而且記錄也可以通過鏈接來豐富語義格式化數(shù)據(jù)。當(dāng)你將記錄存儲(chǔ)于歸檔文件中的時(shí)候,與記錄相關(guān)的語義結(jié)構(gòu)化數(shù)據(jù)通常會(huì)包含所有為其索引而需要的信息。幾乎不可能不需要手工索引記錄。可喜的是,每當(dāng)交易在數(shù)據(jù)庫中進(jìn)行一次,索引就可以自動(dòng)對(duì)其更新從而逐步豐富起來。
集成數(shù)據(jù)庫化和基于文檔的數(shù)據(jù)有另一大優(yōu)點(diǎn),就是很容易支持?jǐn)?shù)據(jù)的多個(gè)版本。在數(shù)據(jù)庫世界這是說不通的,因?yàn)閿?shù)據(jù)庫作為一種模型,且作為一種有用的模型,它必須在對(duì)管理現(xiàn)狀模型的任何提問作出至少一個(gè)最佳的猜測以應(yīng)答。一個(gè)文檔,實(shí)際是某個(gè)特定組織在特定時(shí)間以及特定環(huán)境所做的一個(gè)聲明,而且這也很有可能——經(jīng)常被用來了解——相沖突聲明的存在。
文化沖擊
請(qǐng)注意,數(shù)據(jù)庫化的思考者不是唯一在統(tǒng)一文檔和數(shù)據(jù)庫世界遭遇困難的人。那些思維方式受當(dāng)代文檔和記錄管理系統(tǒng)影響的人會(huì)遇到更大的困難。一時(shí)之間,歸檔文件成為業(yè)務(wù)流程的一部分,而不是流程完成后形成。而索引不是人工完成,也不是一個(gè)文檔一個(gè)索引,而是自動(dòng)并持續(xù)更新的。索引也不再是歸檔的一部分:歸檔僅僅只包含文件,而索引分開維護(hù)。因此不需要把自己局限于一個(gè)歸檔,或者只局限于你自己的歸檔。這些改變是如此深遠(yuǎn),很難想象那些適應(yīng)了舊世界的人也能對(duì)新世界適應(yīng)。
8.不要使用快照模型
具體而正式的歷史信息
我職業(yè)生涯中最大的錯(cuò)誤就是設(shè)計(jì)了這樣的數(shù)據(jù)庫,其中所有服務(wù)請(qǐng)求都被給予一個(gè)時(shí)間戳,以便數(shù)據(jù)添加進(jìn)去后,服務(wù)可以根據(jù)指定時(shí)刻數(shù)據(jù)庫存放的數(shù)據(jù)內(nèi)容來響應(yīng),而不是根據(jù)當(dāng)前內(nèi)容。這個(gè)數(shù)據(jù)庫極其昂貴,把執(zhí)行速度拖累得就像龜行,而且沒能起到很大作用。當(dāng)用戶想看看過去某個(gè)特定的結(jié)果是怎么被計(jì)算出來的時(shí)候,他們不免只能夠查詢歸檔文件,因?yàn)檫@些歸檔文件總是會(huì)包含之前與用戶溝通的結(jié)果。而這也正是他們想要知道的東西。
請(qǐng)注意數(shù)據(jù)庫的用途不是去記錄過去那些成為問題的情況。數(shù)據(jù)庫是現(xiàn)實(shí)世界某些部分的模型,以及在過去某一段時(shí)間里現(xiàn)實(shí)世界那部分的狀態(tài)——它的具體歷史——可能和模型的目的非常相關(guān)。但是,如果它想要再現(xiàn)自己在過去某個(gè)點(diǎn)的狀態(tài),換句話說去記錄它的正式歷史信息,數(shù)據(jù)庫就太把自己當(dāng)回事兒了。
SOA如何支持正式歷史記錄
SOA方法提供了一種再現(xiàn)正式歷史信息的高效方案,不只針對(duì)單個(gè)數(shù)據(jù)庫,而是針對(duì)組織在其管理流程中使用或者產(chǎn)生的所有信息。SOA對(duì)組織信息更新所需的數(shù)據(jù)收集和實(shí)際執(zhí)行更新的分離讓數(shù)據(jù)可以在記錄管理程序中得以歸檔。一旦應(yīng)用了SOA,這就可以自動(dòng)完成,而且合并新的數(shù)據(jù)集幾乎不消做多余的努力。這樣一來,你可以獲得由自己雇員所做的所有輸入消息以及更新。
對(duì)即將離開的線下信息情況來說,可能更簡單。SOA厭惡將瑣事與對(duì)客戶的附加值混合起來,這種混合導(dǎo)致客戶很自然地會(huì)去使用輸出管理服務(wù)以確保離線信息通過適當(dāng)?shù)那腊l(fā)送至目標(biāo)接收者,發(fā)送時(shí)要確保地址是接收者會(huì)使用的,并且格式是接收者確實(shí)能收到的。輸出管理服務(wù)能夠自動(dòng)記錄輸出信息。
盡管如此,還是有個(gè)問題。組織使用SOA傳播信息的難易程度有可能導(dǎo)致對(duì)外界的服務(wù)響應(yīng)數(shù)量大大增加。通常這些服務(wù)響應(yīng)都隱含了組織對(duì)他們聲明內(nèi)容的承諾。如果它們不正確的話,組織可能會(huì)陷入法律難題。SOA處理這種問題的標(biāo)準(zhǔn)方法包括以下指導(dǎo)方針:
實(shí)現(xiàn)和SOA交易概念相一致的業(yè)務(wù)交易。
將放棄承諾包含在對(duì)全部信息進(jìn)行檢索的服務(wù)的服務(wù)水平協(xié)議中。
在需要使用時(shí)才訪問數(shù)據(jù)。這樣可以使數(shù)據(jù)盡可能的最新。
不要撒謊。如果一直講真話,你將很少遇到關(guān)于信息不正確的投訴。
如果使用放棄承諾還使得你不得不對(duì)聲稱信息是不正確的聲明作出反應(yīng),那對(duì)每個(gè)服務(wù)請(qǐng)求和回應(yīng)進(jìn)行日志,采用標(biāo)準(zhǔn)的組織范圍的服務(wù)。
這種工作方式要比數(shù)據(jù)庫化的方案組織起來更簡單,因?yàn)椴恍枰獙?duì)每種消息類型都要求一種額外邏輯,而是調(diào)用日志服務(wù),在日志服務(wù)中整個(gè)輸入或輸出消息都被當(dāng)成是單一的數(shù)據(jù)項(xiàng)來處理。
9.不要相信系統(tǒng)
SOA安全
如果你的身體使用與大多數(shù)Web網(wǎng)站相同的防御規(guī)則來抵制外物,只消一天你就會(huì)死亡。我們生活在一個(gè)懷有敵意的世界,這里唯一能夠避免信息系統(tǒng)遭受攻擊的辦法就是讓它們不可訪問。在這樣的世界,SOA是一種絕妙的安全概念。原則上說,唯一必須讓其通過防火墻的消息是牢牢封裝好的XML消息。它們可以以這樣的方式通過防火墻:在進(jìn)一步處理之前它們會(huì)接受格式良好、XSD一致性以及授權(quán)有效性方面的檢查。這樣,造成危害的可能性非常小。緩沖區(qū)溢出只能夠在安全防御區(qū)內(nèi)爆發(fā),而SQL注入不過是我們對(duì)其充耳不聞的一種語言上的禍害。像這樣畸形的消息在其作出任何傷害之前就能被識(shí)別出來。
認(rèn)識(shí)到這點(diǎn)很重要:即這種方法的優(yōu)勢是基于消息的認(rèn)證和校驗(yàn)而非系統(tǒng)的。這是必要的,因?yàn)榉庋b好的XML常常通過那些對(duì)其內(nèi)容不負(fù)任何責(zé)任的系統(tǒng)傳遞,以至于檢查消息是否來自認(rèn)證過的系統(tǒng)并不能保證什么。它更健壯,因?yàn)槟承畔⑾到y(tǒng)或電腦一次成功侵入并不會(huì)為其他侵入打開大門。
SOA的安全和數(shù)據(jù)庫時(shí)代基于系統(tǒng)的安全形成了鮮明對(duì)比。有了基于系統(tǒng)的安全保障,對(duì)每個(gè)消息類型和數(shù)據(jù)項(xiàng)來說,每個(gè)系統(tǒng)的任務(wù)就是避免緩沖區(qū)溢出。有上千個(gè)點(diǎn)可能成為出錯(cuò)點(diǎn)。因此,就少不了薄弱點(diǎn)存在的可能性。而另一方面,某個(gè)SOA關(guān)守(gatekeeper),可以在單一的點(diǎn)上完成所有這些?;谙到y(tǒng)的訪問安全傾向于把授權(quán)控制構(gòu)建到系統(tǒng)中,這不僅使得跟蹤記錄變得幾乎不可能,而且引入結(jié)構(gòu)性改變(比如把外部組織的客戶添加進(jìn)來)也是很昂貴的花銷。
使用SOA關(guān)守的另一大優(yōu)勢在于可以保證所有輸出消息被適當(dāng)加密和簽名,這樣就沒人能夠竊取消息或在傳輸中篡改消息。原則上,大部分WS-*標(biāo)準(zhǔn)都可以完全由SOA關(guān)守處理。
超越基于系統(tǒng)的授權(quán)
基于系統(tǒng)的安全也會(huì)產(chǎn)生了一些心態(tài),這些心態(tài)更多的是由基于系統(tǒng)的思維決定的,而不是如我們所愿意承認(rèn)的那樣。因?yàn)橄到y(tǒng)是圍繞著功能點(diǎn)和數(shù)據(jù)結(jié)構(gòu)構(gòu)建的,授權(quán)就是這樣表達(dá)的。例如,雇員要么有權(quán)限改變產(chǎn)品價(jià)格,要么沒有,這是基于他在組織中的角色而定。對(duì)后端雇員不會(huì)遇到這種問題,但對(duì)管理層雇員以及用戶而言,這就不適合了。對(duì)他們來說,允許他們查看和完成事情的決定因素是橫跨所有系統(tǒng)和數(shù)據(jù)庫的手頭客戶的信息切片。一個(gè)簡單的信息安全文獻(xiàn)掃描就足以構(gòu)建那些信息安全咨詢公司尚未企及的一點(diǎn):對(duì)每一個(gè)基于切片的訪問安全引用有數(shù)以千記的基于角色的訪問安全。從積極的角度看,涌現(xiàn)出大量的概念,它們對(duì)充分發(fā)揮SOA提供的各項(xiàng)技術(shù)(基于聲明的訪問控制、聯(lián)邦身份及網(wǎng)絡(luò)邊界去除技術(shù))的優(yōu)點(diǎn)來實(shí)現(xiàn)訪問安全有長期正面的影響。
可管理之理論
想要取得SOA最大化的利益,僅僅采用新的行為準(zhǔn)則是不夠的。組織機(jī)構(gòu)考慮自身的方式及IT方式也需要改變。否則當(dāng)前的組織將還是退回到老樣子,并不是因?yàn)樗胍@樣,而是因?yàn)樗堰@看作是控制自身日常行為的唯一方法。為了克服這點(diǎn),你必須從項(xiàng)目的組織去著手。
10.不到最后不要扔掉基礎(chǔ)設(shè)施
為什么要擔(dān)心基礎(chǔ)設(shè)施?
SOA就是要使基礎(chǔ)設(shè)施從業(yè)務(wù)中分離開來,不只是在功能上,而且還在項(xiàng)目管理上:項(xiàng)目經(jīng)理應(yīng)該能夠把思想集中在他負(fù)責(zé)開發(fā)的服務(wù)的商業(yè)附加值上,而不是擔(dān)心基礎(chǔ)設(shè)施。業(yè)務(wù)項(xiàng)目經(jīng)理應(yīng)該去組織開發(fā)一個(gè)作為項(xiàng)目一部分的新授權(quán)服務(wù),而不是去構(gòu)建一個(gè)新電話局,這不會(huì)荒謬到哪里去。讓項(xiàng)目經(jīng)理承擔(dān)類似這些事情會(huì)導(dǎo)致他要協(xié)調(diào)的事物數(shù)目增加,從而進(jìn)一步導(dǎo)致其工作復(fù)雜性不成比例的增加。就算讓他等待直到其他項(xiàng)目經(jīng)理把基礎(chǔ)設(shè)施交付了,這也是應(yīng)該盡可能去避免的。
上述評(píng)論適用于硬件基礎(chǔ)設(shè)施也同樣適用于基礎(chǔ)設(shè)施服務(wù)。計(jì)算能力和網(wǎng)絡(luò)容量應(yīng)該總要超過需求,這樣的話實(shí)施新服務(wù)的項(xiàng)目經(jīng)理就不用擔(dān)心基礎(chǔ)設(shè)施是否能夠?yàn)楸仍阮A(yù)想更多的每天上千個(gè)服務(wù)請(qǐng)求提供支持。鑒于軟件開發(fā)一般都比IT基礎(chǔ)設(shè)施要貴出一個(gè)數(shù)量級(jí),我們最不想要的就是:系統(tǒng)開發(fā)項(xiàng)目由于那些需要確保IT基礎(chǔ)設(shè)施可用性的官僚性流程而被糾纏停滯不前。
基礎(chǔ)設(shè)施:SOA有何不同
好消息是用SOA的方式去提出你的要求然后靜觀其變會(huì)得到簡單、穩(wěn)定的基礎(chǔ)設(shè)施服務(wù)接口。這也就是為什么在你沒有啟動(dòng)任何業(yè)務(wù)項(xiàng)目前,沒有必要去實(shí)施世界上最先進(jìn)的基礎(chǔ)設(shè)施服務(wù)。這些服務(wù)的復(fù)雜性不在于用來調(diào)用它們的接口,而在于它們從其他來源——或者從自我維護(hù)中——要求的信息,以便生產(chǎn)一個(gè)優(yōu)化的結(jié)果。因此,完全可行的辦法是有了初步的基礎(chǔ)設(shè)施服務(wù)就啟動(dòng)項(xiàng)目,然后在業(yè)務(wù)項(xiàng)目中花足夠多的時(shí)間去使用這些服務(wù)來做測試和生產(chǎn)。
壞消息是SOA會(huì)導(dǎo)致更多的功能被分類為基礎(chǔ)設(shè)施。尤其是,每個(gè)瑣事引起一個(gè)通用的服務(wù),而這一服務(wù)必須作為基礎(chǔ)設(shè)施的一部分而不是成為需要它的每個(gè)業(yè)務(wù)功能的一部分來實(shí)現(xiàn)。雖然就本身來說不算很壞,但這的確導(dǎo)致了一個(gè)新問題:對(duì)于基礎(chǔ)設(shè)施的每個(gè)部分來說,如何去組織安排各項(xiàng)事宜才能使既擁有權(quán)限又具有資源的人去確保它能按時(shí)可供使用而且具備了適當(dāng)?shù)墓δ芎腿萘俊=M織若是不能妥善處理這一問題的話,就不能很好地實(shí)施SOA——事情就這么簡單。
敢問路在何方?
雖然組成SOA的要素已存在多時(shí),但SOA本身是全新的。就像集裝箱一樣,它不只是一種全新的處理我們一直以來所做事情的方法,因?yàn)樗沟梦覀兡芤孕碌囊?guī)模合作。而且SOA根本不是一項(xiàng)新技術(shù),而是一種新的思維方式。SOA與我們現(xiàn)在考慮問題的方式是如此不同,所以要是你通讀本文幾遍才開始理解其中的意思,你并不用感到難為情。你對(duì)此的自然傾向是,你會(huì)覺得這些建議不切實(shí)際或沒有必要或者兩者皆是,而使你根本無法對(duì)它作出評(píng)估,在這之前你還需要適應(yīng)一段時(shí)間。
公正地說,也會(huì)出現(xiàn)SOA方案對(duì)你不直接起作用的情況。比如,你可能會(huì)從一些廠商那邊以打包的形式獲得你所有的系統(tǒng),而那些廠商對(duì)采用本文中提到的方式來應(yīng)用SOA一點(diǎn)特別的興趣都沒有。那樣的話,把本文中所給的建議作為指南:使用它們來判定是否你做的選擇會(huì)把你帶向正確的方向。
SOA是如此之新,所以并不是所有為了充分利用SOA而被我們需要的概念、工具及標(biāo)準(zhǔn)都已經(jīng)可用了。我們不能期待現(xiàn)行的關(guān)守(gatekeeper)像一個(gè)SOA關(guān)守(SOA gatekeeper)一樣為我們代勞一切,現(xiàn)行的用戶接口設(shè)備對(duì)于封裝的XML有困難。更糟的是,正如本文表明的那樣,當(dāng)前SOA世界里存在很多撲朔迷離、多余或者錯(cuò)誤的東西。目前,SOA概念和技術(shù)的應(yīng)用無論在哪里都沒有達(dá)到SOA互操作性能力所能夠達(dá)到的層次。我們遇到的互操作性問題往往都是由于其他一些人選擇了實(shí)現(xiàn)稍有不同的眾多WS-*標(biāo)準(zhǔn)中的子集。那些數(shù)以百萬計(jì)的多方通信的可能方案已經(jīng)減少到很少的一把了,但依然還是實(shí)在太多了。
不管怎樣,我們開了個(gè)好頭。接下來我們可以沿著這條路繼續(xù)走。SOA也同樣如此。我們不需要為了進(jìn)步而要去了解我們還不能了解的東西。向前看,我們有極大的潛力去使得事情更簡單、更可靠,更具可預(yù)測性以及功能更豐富。是時(shí)候出發(fā)了。
- 1廈門OA軟件
- 2合肥OA軟件行業(yè)資訊
- 3杭州OA軟件
- 4鄭州OA軟件
- 5濟(jì)南OA軟件
- 6青島OA軟件
- 7太原OA軟件
- 8上海OA軟件
- 9上海OA軟件行業(yè)資訊
- 10石家莊OA軟件
- 11天津OA軟件
- 12沈陽OA軟件
- 1什么是下一代商業(yè)智能?
- 2長沙銀行OA系統(tǒng)區(qū)域化改造項(xiàng)目上線運(yùn)行
- 3何為虛擬硬件平臺(tái)?
- 4如何在云環(huán)境中平衡工作負(fù)載
- 5無線局域網(wǎng)協(xié)議802.11b
- 6NAND閃存前途有隱憂
- 7電子紙業(yè)務(wù)方興未艾
- 8OA辦公系統(tǒng)與Oracle人員組織集成應(yīng)用
- 9統(tǒng)一存儲(chǔ)成未來趨勢
- 10選購重復(fù)數(shù)據(jù)刪除方案的五個(gè)指標(biāo)
- 11無線網(wǎng)協(xié)議IEEE 802.11n 問答
- 12融合云計(jì)算的物聯(lián)網(wǎng)
- 13三網(wǎng)融合加速VoIP取代傳統(tǒng)電話的進(jìn)程
- 14如何提高虛擬化數(shù)據(jù)中心彈性:網(wǎng)絡(luò)架構(gòu)
- 15服務(wù)識(shí)別:邁向SOA終點(diǎn)的關(guān)鍵一步
- 16淺析視頻會(huì)議三大趨勢:向統(tǒng)一通信靠攏
- 17OA辦公軟件系統(tǒng)未來的成功點(diǎn)在哪里?
- 18物聯(lián)網(wǎng)起步要配“三槍”
- 19高清視頻系統(tǒng)的傳輸問題
- 20開福法院引進(jìn)的OA網(wǎng)絡(luò)辦公管理包括電子卷宗、便民訴訟服務(wù)
- 21物聯(lián)網(wǎng)后的商業(yè)革新
- 22數(shù)據(jù)中心與云服務(wù),兩項(xiàng)服務(wù)可否共存?
- 23中國銀行卡發(fā)展30年回顧
- 24數(shù)據(jù)中心模塊化三種不同類型
- 25視頻會(huì)議系統(tǒng)的“軟硬之爭”
- 26如何為Windows服務(wù)器虛擬化配置硬件?
- 27數(shù)據(jù)中心6大技術(shù)創(chuàng)新
- 28OA辦公系統(tǒng)品牌選擇“說說”
- 29長沙OA軟件房地產(chǎn)行業(yè)解決方案
- 302010年數(shù)據(jù)中心網(wǎng)絡(luò):雙層網(wǎng)絡(luò)來臨
成都公司:成都市成華區(qū)建設(shè)南路160號(hào)1層9號(hào)
重慶公司:重慶市江北區(qū)紅旗河溝華創(chuàng)商務(wù)大廈18樓