SOA交易概念
對(duì)數(shù)據(jù)庫(kù)世界陌生的東西對(duì)與SOA來(lái)說(shuō)卻是再自然不過(guò)了。業(yè)務(wù)交易——實(shí)現(xiàn)它的一般是一個(gè)流程——就是服務(wù)。為了理解SOA何以能很好支持邏輯一致性需求,理解業(yè)務(wù)交易的需要很重要。業(yè)務(wù)交易由下面元素組成:
廠商給客戶(hù)提供信息,客戶(hù)據(jù)此可作出采購(gòu)決定。一般來(lái)說(shuō),這種信息包括出售商品和服務(wù)的屬性、得到該商品的條件——包括,當(dāng)然,價(jià)格——以及可用性。從法律的角度,廠商所描述的這一信息是真實(shí)的。
用戶(hù)基于廠商描述的信息下采購(gòu)訂單。
廠商核實(shí)該采購(gòu)決定依據(jù)的信息是否仍然適用,如果是,則確認(rèn)該訂單。如果有變化——可能由于產(chǎn)品或服務(wù)已終止,或產(chǎn)品已經(jīng)漲價(jià),也可能是貨物或服務(wù)的規(guī)格已經(jīng)變更——那么需要一些處理來(lái)決定到底應(yīng)該如何做:是不管三七二十一繼續(xù)提交訂單,還是通過(guò)協(xié)商修改訂單,或者干脆取消訂單。
廠商和客戶(hù)雙方履行采購(gòu)協(xié)議中各項(xiàng)條約。
SOA怎樣維持一致性
SOA通過(guò)多種方法維護(hù)業(yè)務(wù)交易的邏輯一致性。第一,所有暗含對(duì)前一個(gè)狀況改變的通信都要使用能夠保證消息安全交付的協(xié)議來(lái)完成。只要廠商或用戶(hù)做出某個(gè)承諾,為實(shí)現(xiàn)該承諾所要做的動(dòng)作就應(yīng)該包含這樣的改變。這樣的話,客戶(hù)和廠商就不可能對(duì)當(dāng)前業(yè)務(wù)狀態(tài)持有不同的看法了。
第二,數(shù)據(jù)庫(kù)的邏輯一致性和流程管理系統(tǒng)中處理過(guò)程的記錄可以通過(guò)兩階段提交協(xié)議來(lái)維護(hù)。跨多個(gè)數(shù)據(jù)庫(kù)的邏輯一致性通過(guò)一連串這樣的兩階段提交維護(hù)。首先讓數(shù)據(jù)庫(kù)A和流程管理系統(tǒng)同步,然后流程管理系統(tǒng)再和數(shù)據(jù)庫(kù)B同步,以此類(lèi)推。
第三,從廠商給客戶(hù)展示產(chǎn)品到訂單下達(dá)期間,廠商面對(duì)的任何改變都可以使用樂(lè)觀鎖并發(fā)控制機(jī)制來(lái)處理。這種處理方式對(duì)SOA來(lái)說(shuō)很自然:判斷是否存在相應(yīng)改動(dòng)的過(guò)程可以完全自動(dòng)化。因?yàn)镾OA使得數(shù)據(jù)在被用來(lái)作決定的同時(shí)也可以進(jìn)行訪問(wèn),找不到樂(lè)觀鎖而需要人工介入的情況幾乎鮮有發(fā)生。
最后,一筆交易的中止——比如說(shuō)用戶(hù)撤銷(xiāo)了訂單,原因可能是用戶(hù)沒(méi)有能力支付,或者用戶(hù)去世了——使用SOA可以相對(duì)容易地處理。因?yàn)樵诮灰咨舷挛闹惺褂没虍a(chǎn)生的記錄可以被清晰地識(shí)別,所以可以確定需要哪些補(bǔ)償信息用以糾正用戶(hù)和廠商的不同認(rèn)知。因?yàn)槟膫(gè)數(shù)據(jù)庫(kù)更新和該交易有直接關(guān)系是很清楚的,在數(shù)據(jù)庫(kù)中的哪些變更需要使用補(bǔ)償交易服務(wù)做回滾也很清楚。假設(shè),交易中止的發(fā)生相對(duì)不那么頻繁,使這些活動(dòng)完全自動(dòng)化通常是高投入低產(chǎn)出的,但是你的設(shè)計(jì)必須要考慮到這些。
請(qǐng)注意業(yè)務(wù)交易的范圍限制在那些為了處理某個(gè)服務(wù)請(qǐng)求而直接完成的操作。在SOA中,編排你自己的流程并提供事件通知給他人,是一條守則。如果服務(wù)中止了,那么有必要發(fā)通知用戶(hù)這一個(gè)變化。至于他們要怎么處理,則完全是他們自己的事。
也請(qǐng)注意,創(chuàng)建用戶(hù)服務(wù)請(qǐng)求的內(nèi)容,嚴(yán)格說(shuō)起來(lái),應(yīng)該在流程處理之前進(jìn)行,而不應(yīng)該作為流程處理的一部分。這真的不是你該做的事:原則上,提供消息的XSD和消息驗(yàn)證服務(wù)給用戶(hù)就夠了,讓他決定是從鍵盤(pán)錄入數(shù)據(jù)還是從他自己的信息系統(tǒng)以某種方式直接生成數(shù)據(jù)。對(duì)消費(fèi)者來(lái)說(shuō),這并不是——尚未成為——一個(gè)可行的方法,但采集數(shù)據(jù)和處理數(shù)據(jù)是兩件獨(dú)立的事情,并使用不同工具在各自的環(huán)境中執(zhí)行這些事情,對(duì)于這一點(diǎn)仍然是有效的。同樣是數(shù)據(jù)采集,有很多實(shí)現(xiàn)方式,這取決于用戶(hù)的期望以及他們和你溝通的渠道,但不管怎樣都應(yīng)該只有一個(gè)服務(wù)去處理這事兒。
7.不要將自己禁錮于模型
數(shù)據(jù)庫(kù)只是模型,SOA代表更多
領(lǐng)域模型是領(lǐng)域本身的體現(xiàn),操作領(lǐng)域模型要比直接操作領(lǐng)域更簡(jiǎn)單。絕大多數(shù)的數(shù)據(jù)庫(kù)都是模型。它們以這樣一種方式代表一些管理的、物理的或者社會(huì)的領(lǐng)域:相關(guān)領(lǐng)域的問(wèn)題都可以通過(guò)查詢(xún)數(shù)據(jù)庫(kù)來(lái)得到答案,而存在于領(lǐng)域中所需的行為可以從數(shù)據(jù)庫(kù)內(nèi)部得到指示。比如說(shuō),通過(guò)訪問(wèn)數(shù)據(jù)庫(kù)查詢(xún)用戶(hù)的地址信息要比跟隨用戶(hù)到他家然后抄下他所進(jìn)房子的門(mén)牌號(hào)要方便的多。而且,在數(shù)據(jù)庫(kù)中對(duì)記錄進(jìn)行計(jì)數(shù)也要比清點(diǎn)一個(gè)城市有多少人或倉(cāng)庫(kù)里有多少產(chǎn)品要容易。原則上,提供對(duì)這些功能的支持足以確定數(shù)據(jù)庫(kù)的數(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ù)庫(kù)和用戶(hù)有關(guān),那么每個(gè)用戶(hù)通常都應(yīng)該存在對(duì)應(yīng)的數(shù)據(jù)庫(kù)記錄,包括一些數(shù)據(jù)庫(kù)使用者感興趣的與用戶(hù)相關(guān)的信息。因?yàn)閿?shù)據(jù)模型更多是基于功能上的考慮而不是某些特定數(shù)據(jù)庫(kù)的使用,所以將數(shù)據(jù)結(jié)構(gòu)建立在這種模型之上會(huì)使數(shù)據(jù)庫(kù)能夠更易適應(yīng)各種未預(yù)見(jiàn)的需求。數(shù)據(jù)庫(kù)在語(yǔ)義上被結(jié)構(gòu)化了;換句話來(lái)講,數(shù)據(jù)庫(kù)是根據(jù)其表達(dá)出的意思來(lái)構(gòu)造的。
對(duì)沒(méi)有實(shí)現(xiàn)數(shù)據(jù)模型的數(shù)據(jù)結(jié)構(gòu),數(shù)據(jù)庫(kù)技術(shù)就沒(méi)那么方便了。它實(shí)在不能在描述、文本、圖像等方面做很多貢獻(xiàn)。相反,SOA卻能夠很好地處理文檔、記錄,就像可以很好處理那些根據(jù)數(shù)據(jù)模型構(gòu)建的數(shù)據(jù)一樣。SOA允許單個(gè)設(shè)計(jì)能夠處理語(yǔ)義結(jié)構(gòu)化信息和文檔。盡管如此,由于數(shù)據(jù)庫(kù)系統(tǒng)支配了我們的思維模式,所以當(dāng)應(yīng)用SOA時(shí)免不了很自然的會(huì)堅(jiān)持其局限性。但是在SOA的世界里不存在特殊的理由要去應(yīng)用這種限制,任何理由都不能夠這樣做。