
SOA架構(gòu)設(shè)計(jì)經(jīng)驗(yàn)分享—架構(gòu)、職責(zé)、數(shù)據(jù)一致性
1.背景介紹
最近一段時(shí)間都在做系統(tǒng)分析和設(shè)計(jì)工作,面對(duì)的業(yè)務(wù)是典型的重量級(jí)企業(yè)應(yīng)用方向。突然發(fā)現(xiàn)很多以往覺(jué)得很簡(jiǎn)單的問(wèn)題變得沒(méi)有想象的那么容易,最大的問(wèn)題就是職責(zé)如何分配。論系統(tǒng)架構(gòu)設(shè)計(jì)的最大的問(wèn)題,其實(shí)也就是職責(zé)的分配,分配的合理,實(shí)現(xiàn)起來(lái)就會(huì)很柔性,反之就會(huì)使架構(gòu)很混亂。
軟件的生命周期大概可以歸納為四個(gè)基本的過(guò)程,分析、設(shè)計(jì)、實(shí)現(xiàn)、測(cè)試,當(dāng)然這僅僅是一個(gè)最為粗略的表示而已。不同的方法論有著不同的使用這幾個(gè)過(guò)程的方式。RUP使用快速迭代的過(guò)程,在這個(gè)幾個(gè)子過(guò)程中適當(dāng)?shù)妮敵鲆恍┻^(guò)程制品,每次迭代都是進(jìn)行相同的分析、設(shè)計(jì)、實(shí)現(xiàn)、測(cè)試。而在Scrum中,不提倡輸出任何文檔形式的過(guò)程制品,也同樣有著上述幾個(gè)過(guò)程,強(qiáng)調(diào)以人為中心,通過(guò)溝通來(lái)解決大部分的問(wèn)題。
不能用好與不好來(lái)判斷哪一種方法論,只能根據(jù)目前的實(shí)際情況綜合權(quán)衡。RUP的每次迭代中有幾個(gè)關(guān)鍵的制品對(duì)系統(tǒng)分析、設(shè)計(jì)很重要,可以說(shuō)是非常重要,如:詞匯表、業(yè)務(wù)規(guī)則文檔、用例、領(lǐng)域草圖。這幾個(gè)制品對(duì)分析、設(shè)計(jì)很重要,需要從這幾個(gè)制品中提煉出設(shè)計(jì)模型最終才能落地。這主要用在業(yè)務(wù)復(fù)雜的應(yīng)用系統(tǒng)中。而Scrum更加的輕量級(jí),可以用在互聯(lián)網(wǎng)項(xiàng)目中,業(yè)務(wù)不是太復(fù)雜的情況下。
其實(shí)我為什么要強(qiáng)調(diào)軟件工程及開(kāi)發(fā)方法論,是因?yàn)槲易罱l(fā)現(xiàn),做設(shè)計(jì)其實(shí)是建立在分析的基礎(chǔ)上的,但是這里面又有很多問(wèn)題。大型企業(yè)級(jí)應(yīng)用,并不能通過(guò)一次性分析就可以得出準(zhǔn)確和全部的需求,初期階段建立的需求70%都是不準(zhǔn)確的。所以做架構(gòu)需要有分析的能力才行且是建立在適當(dāng)?shù)拈_(kāi)發(fā)方論上的分析,什么時(shí)候該用RUP,什么時(shí)候該用Scrum,什么時(shí)候該用XP都很有講究。分析與設(shè)計(jì)都需要有一個(gè)執(zhí)行上下文,不同的上下文對(duì)分析、設(shè)計(jì)的執(zhí)行有著不同的要求。
有句話我覺(jué)得對(duì)架構(gòu)者來(lái)說(shuō)很有啟發(fā):分析就是做正確的事,設(shè)計(jì)就是正確的做事。架構(gòu)跟語(yǔ)言跟平臺(tái)關(guān)系不大,畢竟架構(gòu)是設(shè)計(jì)過(guò)程中的子過(guò)程,我想如果你的設(shè)計(jì)不合理,你用任何語(yǔ)言任何平臺(tái)都解決不了問(wèn)題。(這里的架構(gòu)上下文指:企業(yè)應(yīng)用架構(gòu)不是基礎(chǔ)設(shè)施的系統(tǒng)架構(gòu))
2.SOA的架構(gòu)層次
進(jìn)行SOA類(lèi)型的架構(gòu)設(shè)計(jì)就需要搞清楚SOA架構(gòu)模型才行。并不能想當(dāng)然的對(duì)系統(tǒng)進(jìn)行簡(jiǎn)單的拆分就行,需要搞清楚SOA的架構(gòu)模型是怎樣的,每一塊是干什么用的,這樣設(shè)計(jì)由分析階段輸出的需求時(shí)才能正確的劃分職責(zé)。
如果把SOA的架構(gòu)簡(jiǎn)單的理解為是多個(gè)子系統(tǒng)之間的整合其實(shí)有點(diǎn)太過(guò)于簡(jiǎn)單,也沒(méi)有真正搞清楚SOA的架構(gòu)模型。按照SOA的正確方法論及目標(biāo)模型,其實(shí)SOA在實(shí)現(xiàn)架構(gòu)落地上,需要考慮到對(duì)服務(wù)的組合,不斷的重用現(xiàn)有的服務(wù),讓企業(yè)應(yīng)用可以逐步集成,快速實(shí)現(xiàn)業(yè)務(wù)的迭代。其實(shí)這就是本節(jié)要講的服務(wù)的分層,通過(guò)分層將服務(wù)按照使用類(lèi)型進(jìn)行分配,上層服務(wù)對(duì)下層服務(wù)的包裝,下層服務(wù)負(fù)責(zé)原子性的操作,上層服務(wù)對(duì)下層服務(wù)進(jìn)行業(yè)務(wù)性的組合。
我們來(lái)看具體的每一層的作用及主要職責(zé)。
2.1.應(yīng)用服務(wù)(原子服務(wù))
應(yīng)用服務(wù)就是諸如:訂單服務(wù)、倉(cāng)庫(kù)服務(wù)、銷(xiāo)售服務(wù)、客戶管理服務(wù),這些服務(wù)直接對(duì)應(yīng)不同的應(yīng)用系統(tǒng),直接服務(wù)這些應(yīng)用系統(tǒng)的原子操作。訂單服務(wù)直接原子性的插入訂單,沒(méi)有任何跨其他服務(wù)的分支邏輯。倉(cāng)庫(kù)服務(wù)只管自己的倉(cāng)庫(kù)邏輯。同樣其他的應(yīng)用服務(wù)只管好自己的職責(zé),杜絕對(duì)其他服務(wù)的調(diào)用。
圖1:
應(yīng)用服務(wù)位于UI與后臺(tái)之間,后臺(tái)我們可以認(rèn)為它是一異構(gòu)的系統(tǒng)或者是數(shù)據(jù)庫(kù)之類(lèi)的。應(yīng)用服務(wù)的位置位于前端與后端之間,起到類(lèi)似一個(gè)服務(wù)API的作用,但是SOA中的服務(wù)還遠(yuǎn)遠(yuǎn)不止這一個(gè)應(yīng)用服務(wù),如果我們的SOA架構(gòu)中只有一種類(lèi)型的服務(wù),那么這會(huì)增加我們系統(tǒng)的耦合程度,因?yàn)槟銢](méi)有對(duì)系統(tǒng)的服務(wù)進(jìn)行層次的劃分,你的業(yè)務(wù)功能會(huì)直接的落到某一個(gè)應(yīng)用線上的服務(wù),繼續(xù)往下看。
2.2.組合服務(wù)
組合服務(wù)是對(duì)應(yīng)用服務(wù)的一個(gè)組合,根據(jù)實(shí)際項(xiàng)目的規(guī)模大小,不一定非要進(jìn)行物理的隔離,在代碼層面的服務(wù)化也是可以的,在將來(lái)的某一天有必要的情況下再進(jìn)行物理的拆分,畢竟物理的拆分有著嚴(yán)重的成本和代價(jià),對(duì)系統(tǒng)的穩(wěn)定性帶來(lái)很多挑戰(zhàn)。所以經(jīng)驗(yàn)告訴我們必要的時(shí)候在進(jìn)行拆分。”分布式系統(tǒng)設(shè)計(jì)的第一個(gè)原則就是盡量不要分布式“,這是馬丁.福勒大師說(shuō)的,現(xiàn)在理解確實(shí)感同身受。
圖2:
組合服務(wù)對(duì)下層的應(yīng)用服務(wù)進(jìn)行了組合,完成了一個(gè)基本的業(yè)務(wù)動(dòng)作,應(yīng)用服務(wù)中是最基本的基礎(chǔ)性的原子性的操作。但是在復(fù)雜的業(yè)務(wù)需求下大部分業(yè)務(wù)功能都需要跨越多個(gè)應(yīng)用線來(lái)完成一個(gè)最外層的企業(yè)動(dòng)作。提交訂單可能需要穿過(guò)很多應(yīng)用線,訂單管理、倉(cāng)庫(kù)、財(cái)務(wù)等等環(huán)節(jié)。所以這里我們還需要一個(gè)能在最外層對(duì)組合服務(wù)進(jìn)行編排的業(yè)務(wù)服務(wù)。這個(gè)編排服務(wù)可以完全是自動(dòng)化的,通過(guò)工作流引擎進(jìn)行組合自動(dòng)化來(lái)完成,這對(duì)企業(yè)應(yīng)用的自動(dòng)化流程很有意義。
2.3.業(yè)務(wù)服務(wù)(編排服務(wù))
業(yè)務(wù)服務(wù)是最外層的服務(wù),向下編排了組合服務(wù)。業(yè)務(wù)服務(wù)位于最上層,當(dāng)需要有跨越多個(gè)應(yīng)用線來(lái)完成的業(yè)務(wù),這個(gè)業(yè)務(wù)就放入業(yè)務(wù)服務(wù)中。比如提交訂單,先檢查庫(kù)存、扣減庫(kù)存(凍結(jié)庫(kù)存),然后下單,再往后通知財(cái)務(wù),再往后通知物流等等都是一個(gè)復(fù)雜的企業(yè)服務(wù)線。這種最外層的業(yè)務(wù)邏輯如果你不進(jìn)行SOA分層然后將其放入最外層的業(yè)務(wù)服務(wù)中,你把它放入任何一個(gè)應(yīng)用線都會(huì)使系統(tǒng)調(diào)用混亂不堪。所以問(wèn)題就是需要進(jìn)行縱向的劃分層次。如果進(jìn)行了SOA的層次劃分后就不會(huì)出現(xiàn)互相亂用的情況。其實(shí)這里可以參考阿里的服務(wù)設(shè)計(jì)方法。(李智慧寫(xiě)的一本大型互聯(lián)網(wǎng)架構(gòu)與實(shí)踐里面也講到了服務(wù)要?jiǎng)澐謱哟危?/span>
圖3:
當(dāng)在業(yè)務(wù)服務(wù)中執(zhí)行的業(yè)務(wù)邏輯時(shí),需要跨越多個(gè)應(yīng)用線來(lái)完成。這部分的邏輯也說(shuō)是職責(zé),如果不放入這個(gè)位置,放在哪個(gè)應(yīng)用線都不合適,放入哪個(gè)應(yīng)用線都會(huì)使系統(tǒng)調(diào)用出現(xiàn)混亂。其實(shí)這里的問(wèn)題就是我們不能用一個(gè)維度來(lái)進(jìn)行SOA系統(tǒng)的設(shè)計(jì),本來(lái)服務(wù)就具有組合特性,所以適當(dāng)?shù)奶嵘?wù)的層次是有好處的,但是應(yīng)用服務(wù)和組合服務(wù)可以在代碼層面上進(jìn)行構(gòu)建,而業(yè)務(wù)服務(wù)也叫編排服務(wù)是需要進(jìn)行物理隔離的,畢竟考慮到系統(tǒng)復(fù)雜度和穩(wěn)定性問(wèn)題這是值得的。在排查問(wèn)題,系統(tǒng)性能、穩(wěn)定性等等方面,物理的隔離有一定的作用,畢竟業(yè)務(wù)服務(wù)本來(lái)就是來(lái)組合多個(gè)應(yīng)用線的,這樣做會(huì)使整個(gè)系統(tǒng)架構(gòu)很清晰。
3.SOA化的重構(gòu)
進(jìn)行SOA化的實(shí)施,大部分情況下都是對(duì)現(xiàn)有系統(tǒng)進(jìn)行重構(gòu)后考慮的,初期企業(yè)發(fā)展階段以快速出原形為首要目標(biāo),只有當(dāng)系統(tǒng)出現(xiàn)瓶頸了才會(huì)考慮運(yùn)用SOA來(lái)解決。但是在這個(gè)時(shí)候有很多歷史包袱無(wú)法解決,進(jìn)行SOA化的重構(gòu)其實(shí)成本是很高的,而且很危險(xiǎn),對(duì)有些復(fù)雜的邏輯說(shuō)的現(xiàn)實(shí)點(diǎn),是無(wú)能為力的。如果都可以通過(guò)重構(gòu)這個(gè)技術(shù)來(lái)解決,那我們就太天真了。《重構(gòu)—馬丁.福勒》一書(shū)講的是代碼層面的重構(gòu),跟做系統(tǒng)級(jí)重構(gòu)兩個(gè)概念。對(duì)系統(tǒng)級(jí)別的重構(gòu)還沒(méi)有太多成熟的方法論支撐。尤其現(xiàn)在新技術(shù)層出不窮的,各有優(yōu)點(diǎn),能很好的運(yùn)用這些技術(shù)、方法論、過(guò)程來(lái)重構(gòu)大型企業(yè)級(jí)系統(tǒng),難度非常大,這需要整個(gè)公司投入很多人力、資源成本?;剡^(guò)頭來(lái)想想,其實(shí)在前期適當(dāng)考慮一下還是有必要的,這樣可以減少后期很多技術(shù)債務(wù)。
這里我只總結(jié)我在分析、設(shè)計(jì)公司某一塊業(yè)務(wù)系統(tǒng)的時(shí)候?qū)ζ溥M(jìn)行SOA化的重構(gòu)思路。重構(gòu)本來(lái)就是一個(gè)不斷迭代的過(guò)程,不可以跨大步。通過(guò)很多腳手架支撐,讓系統(tǒng)慢慢的過(guò)度到新的SOA架構(gòu)下,既然要實(shí)施SOA架構(gòu),那么很重要的一點(diǎn)就是對(duì)遷移的業(yè)務(wù)邏輯適當(dāng)?shù)臍w類(lèi),什么業(yè)務(wù)邏輯該放入“業(yè)務(wù)服務(wù)”中,什么邏輯該在代碼層面上放入“組合服務(wù)”中,對(duì)基本的操作有如何放入代碼層面的“應(yīng)用服務(wù)”中。
3.1.保留服務(wù)空間,為了將來(lái)服務(wù)的組合
在進(jìn)行系統(tǒng)拆分的時(shí)候,對(duì)當(dāng)前后端的調(diào)用都進(jìn)行適當(dāng)?shù)囊?guī)劃,將其分為兩類(lèi),一類(lèi)是應(yīng)用服務(wù),一類(lèi)是組合服務(wù),這兩個(gè)服務(wù)是可以在代碼層面上進(jìn)行抽象。重點(diǎn)是那些調(diào)用其他系統(tǒng)的地方,需要將其放入業(yè)務(wù)服務(wù)中,這塊邏輯比較復(fù)雜,難以抽取,需要適當(dāng)?shù)慕Y(jié)合”數(shù)據(jù)落地“的思路來(lái)綜合考慮。有時(shí)候把一部分?jǐn)?shù)據(jù)落入本地可以提升系統(tǒng)的整體簡(jiǎn)潔度和穩(wěn)定性,但是要考慮數(shù)據(jù)的一個(gè)生命周期性質(zhì)。
在遷移的過(guò)程中可能還會(huì)有一些新的功能并行開(kāi)發(fā)的,既有新的邏輯需要放入新的SOA服務(wù)中,也會(huì)有遷移過(guò)來(lái)的邏輯,這兩個(gè)過(guò)程同時(shí)進(jìn)行其實(shí)很痛苦,盡量避免這樣同時(shí)進(jìn)行,但是現(xiàn)實(shí)是根本不可能,正常都是一起并行推進(jìn)。如果這兩個(gè)過(guò)程是同一組團(tuán)隊(duì)負(fù)責(zé)其實(shí)還好,畢竟對(duì)這塊的代碼、業(yè)務(wù)都比較了解。
這一節(jié)目的是想強(qiáng)調(diào)對(duì)現(xiàn)在系統(tǒng)進(jìn)行遷移的時(shí)候要考慮服務(wù)的層次,不要只進(jìn)行一個(gè)簡(jiǎn)單的搬移代碼,這個(gè)時(shí)候是一個(gè)對(duì)代碼進(jìn)行重構(gòu)的好機(jī)會(huì),該劃分層次的要?jiǎng)澐謱哟?,該讀寫(xiě)分離的要讀寫(xiě)分離,要重點(diǎn)考慮那些“業(yè)務(wù)服務(wù)”,需要跨越多個(gè)應(yīng)用線的邏輯。
順便說(shuō)一下,還有一個(gè)重點(diǎn)就是遷移的時(shí)候還要考慮數(shù)據(jù)存儲(chǔ)方面的遷移,光代碼層面的遷移只是第一步,第二步還需要進(jìn)行數(shù)據(jù)層面的遷移。當(dāng)然這兩個(gè)大的步驟都是要通過(guò)很多次迭代完成,并且還是一個(gè)對(duì)業(yè)務(wù)、代碼進(jìn)行很好梳理和整理的好機(jī)會(huì)。
在將系統(tǒng)進(jìn)行服務(wù)化的時(shí)候要考慮服務(wù)層,如果當(dāng)前沒(méi)有業(yè)務(wù)服務(wù)的邏輯那么就保留服務(wù)空間,至少要清楚在服務(wù)層中有這么一個(gè)空間是要預(yù)留的,當(dāng)有其他的應(yīng)用線需要與你交互的時(shí)候可以順利的進(jìn)入到你的服務(wù)區(qū),而不是直接到達(dá)你的應(yīng)用。
4.運(yùn)用DDD+GRASP進(jìn)行分析和設(shè)計(jì)(防止主觀的判斷導(dǎo)致錯(cuò)誤的假設(shè))
做系統(tǒng)設(shè)計(jì)時(shí)最怕的就是職責(zé)搞錯(cuò)了,這會(huì)使系統(tǒng)的架構(gòu)突然就復(fù)雜了,而且系統(tǒng)架構(gòu)都是很難改變的或者壓根就無(wú)法改變的決定。所以我對(duì)這塊引起了重視,有時(shí)候你對(duì)業(yè)務(wù)在了解在熟悉依然會(huì)搞錯(cuò)職責(zé),對(duì)于這塊光憑主觀的判斷是不長(zhǎng)遠(yuǎn)的,無(wú)發(fā)復(fù)制、無(wú)法傳播的,也無(wú)法落字成文的。
對(duì)DDD我這里就不多做介紹了,這里要強(qiáng)調(diào)是GRASP。運(yùn)用DDD可以很好的幫助我們來(lái)戰(zhàn)略性的觀察企業(yè)所坐立的領(lǐng)域,我還是很提倡DDD在公司實(shí)施的,不說(shuō)DDD中的“戰(zhàn)術(shù)設(shè)計(jì)”方法論,就光說(shuō)它的“戰(zhàn)略設(shè)計(jì)”方法論還是有很大作用的,讓我們可以在腦海中建立一個(gè)戰(zhàn)略性的模型。具體要不要進(jìn)行代碼層面的落地這就看實(shí)際情況了。而且DDD中的很多不錯(cuò)的思想都可以借鑒過(guò)來(lái),包括領(lǐng)域通用語(yǔ)言,有了領(lǐng)域通用語(yǔ)言團(tuán)隊(duì)之間的溝通和交流會(huì)節(jié)省很多成本。對(duì)于新人來(lái)說(shuō),可以很快的了解公司的一些大概的業(yè)務(wù),這和“詞匯表”其實(shí)還是有區(qū)別的。
上面說(shuō)了,在劃分職責(zé)的時(shí)候很多都是通過(guò)經(jīng)驗(yàn)來(lái)主觀的判斷,沒(méi)有其他的客觀證據(jù)了。那么有沒(méi)有一個(gè)不錯(cuò)的方法論或模式來(lái)指導(dǎo)我們進(jìn)行這類(lèi)問(wèn)題的解決呢,其實(shí)還是有的,因?yàn)樵趪?guó)外人家這方面已經(jīng)很成熟。
GRASP就是這樣的一套模式,它可以幫助我們進(jìn)行客觀的設(shè)計(jì)職責(zé)。到底該把這塊數(shù)據(jù)放入哪個(gè)應(yīng)用中,到底該把這個(gè)邏輯放入哪個(gè)服務(wù)中,都有指導(dǎo),包括對(duì)對(duì)象層面的設(shè)計(jì)依然可以。我們可能對(duì)“信息專(zhuān)家模式”都有了解,但是以往我們可能都只把它用在對(duì)象設(shè)計(jì)上,而沒(méi)有提升一個(gè)系統(tǒng)層面中考慮。那是因?yàn)槲覀円酝赡軟](méi)有碰見(jiàn)很復(fù)雜的職責(zé)分配場(chǎng)景,只有當(dāng)出現(xiàn)問(wèn)題時(shí)我們才能真正領(lǐng)會(huì)某個(gè)東西的好壞。
DDD只有結(jié)合GRASP才能客觀準(zhǔn)確的方配某個(gè)領(lǐng)域的職責(zé),不管是戰(zhàn)略設(shè)計(jì)層面還是戰(zhàn)術(shù)設(shè)計(jì)層面,都是一個(gè)很好的平衡標(biāo)準(zhǔn),不會(huì)由于技術(shù)人員主觀的興趣傾向?qū)е乱粋€(gè)錯(cuò)誤的職責(zé)分配決定,而這個(gè)錯(cuò)誤的決定最終是要開(kāi)發(fā)人員來(lái)買(mǎi)單。
5.SOA分布式下的數(shù)據(jù)一致性
傳統(tǒng)分布式系統(tǒng)與當(dāng)代的面向SOA的分布式系統(tǒng)有一定區(qū)別,論概念上來(lái)講SOA是以服務(wù)為中心,既然以服務(wù)為中心就會(huì)有很多面向服務(wù)的設(shè)計(jì)原則。而傳統(tǒng)的分布式系統(tǒng)沒(méi)有服務(wù)的概念,也沒(méi)有所謂的一切皆是服務(wù)的原則。而當(dāng)代SOA則首要原則就要以服務(wù)為中心,針對(duì)服務(wù)的設(shè)計(jì)又有了很多服務(wù)設(shè)計(jì)原則。
SOA對(duì)服務(wù)還進(jìn)行了類(lèi)型的劃分,按照服務(wù)的應(yīng)用層次來(lái)分類(lèi):業(yè)務(wù)服務(wù)、組合服務(wù)、應(yīng)用服務(wù),包裝服務(wù)等。再按照管理與運(yùn)維的層面來(lái)分類(lèi):控制服務(wù)、調(diào)度服務(wù)、監(jiān)控服務(wù)等等。傳統(tǒng)的分布式系統(tǒng)是沒(méi)有這些的,我們談?wù)摰氖钱?dāng)代SOA的分布式系統(tǒng),所以我們強(qiáng)調(diào)的是以服務(wù)為中心,以服務(wù)設(shè)計(jì)原則為架構(gòu)設(shè)計(jì)的指導(dǎo)要求,當(dāng)代SOA是對(duì)傳統(tǒng)分布式系統(tǒng)的一個(gè)迭代進(jìn)化,不是一個(gè)時(shí)代的產(chǎn)物,SOA更加強(qiáng)調(diào)了以服務(wù)為首要原則,已經(jīng)提升到了另外一個(gè)更加高級(jí)的層面。
本節(jié)我們交流一下在當(dāng)代SOA分布式系統(tǒng)中的數(shù)據(jù)一致性問(wèn)題,在SOA中這主要涉及兩個(gè)層面來(lái)考慮,一個(gè)是服務(wù)層面、一個(gè)數(shù)據(jù)持久化層面。再按照一致性的基本要求,可以分為:讀一致性、寫(xiě)一致性、會(huì)話一致性、最終一致性、實(shí)時(shí)一致性等幾個(gè)維度,當(dāng)然還有其他幾個(gè)維度的一致性要求。
我們這里重點(diǎn)討論在企業(yè)應(yīng)用中實(shí)施SOA時(shí)遇到的一些比較棘手的數(shù)據(jù)一致性問(wèn)題和解決方案,對(duì)于剛才提到的幾個(gè)維度的一致性要求均具有重要的參考價(jià)值。
5.1.分布式事務(wù)(基于DTC的分布式事務(wù))
以往包括目前很多項(xiàng)目還是傾向于使用DTC來(lái)處理分布式事務(wù),這個(gè)方案多數(shù)適用于一般的企業(yè)應(yīng)用,業(yè)務(wù)、訪問(wèn)量、數(shù)據(jù)量要求都不是很高的情況下。用DTC很方便,事務(wù)的自動(dòng)傳播、事務(wù)的自動(dòng)感知、事務(wù)的自動(dòng)回滾和提交,這都是中央DTC幫我們管理好了。
由于有中央DTC的統(tǒng)一協(xié)調(diào),看似好像幫我們解決了很多我們需要考慮的問(wèn)題,但是它也是整個(gè)平臺(tái)的致命的瓶頸,一旦DTC由于某個(gè)問(wèn)題出現(xiàn)錯(cuò)誤,而且這種錯(cuò)誤都是系統(tǒng)層面的錯(cuò)誤,很多問(wèn)題我們是無(wú)能為力的。如果出現(xiàn)問(wèn)題,整個(gè)應(yīng)用平臺(tái)都無(wú)法完成任何一個(gè)跨服務(wù)的業(yè)務(wù)流程,這其實(shí)很危險(xiǎn),你不無(wú)法控制系統(tǒng)的穩(wěn)定性。
這里總結(jié),DTC用于一般的小型企業(yè)應(yīng)用,不建議用在中等規(guī)模的企業(yè)應(yīng)用中,不是說(shuō)這個(gè)東西不好,而是無(wú)法控制它。
5.2.事務(wù)補(bǔ)償(提供正向或反向的操作來(lái)讓數(shù)據(jù)在業(yè)務(wù)上是一致的)
世界級(jí)SOA專(zhuān)家所編寫(xiě)的書(shū)籍里都提到了使用“補(bǔ)償”操作來(lái)完成數(shù)據(jù)的不一致性,當(dāng)我們編寫(xiě)了一個(gè)服務(wù)方法A,就需要一個(gè)服務(wù)方法A1的補(bǔ)償接口來(lái)完成A服務(wù)的補(bǔ)償操作。但是真實(shí)的業(yè)務(wù)情況下很難實(shí)施這種看起來(lái)好像很優(yōu)美很柔性的設(shè)計(jì)。沒(méi)有實(shí)踐就沒(méi)有發(fā)言權(quán),我們公司的技術(shù)團(tuán)隊(duì)就實(shí)施過(guò)這種方案,但是很不理想,這跟技術(shù)本身及技術(shù)團(tuán)隊(duì)沒(méi)關(guān)系,只是我們的平臺(tái)業(yè)務(wù)太復(fù)雜,很難去“補(bǔ)償”一個(gè)已經(jīng)做過(guò)的操作。
這當(dāng)然也要看你所面對(duì)的項(xiàng)目情況,量變引起質(zhì)變,如果你的各種量都上去了,這個(gè)“補(bǔ)償”方案不實(shí)際,而且很難在數(shù)據(jù)層面進(jìn)行“補(bǔ)償“??傊@不是一個(gè)中長(zhǎng)期的方案。
5.3.異步EDA(基于異步事件流來(lái)實(shí)現(xiàn)柔性的分布式事務(wù))
EDA簡(jiǎn)稱(chēng)”事件驅(qū)動(dòng)架構(gòu)“。多個(gè)系統(tǒng)之間通過(guò)傳播”事件“來(lái)驅(qū)動(dòng)整個(gè)業(yè)務(wù)的運(yùn)轉(zhuǎn)。系統(tǒng)之間沒(méi)有緊耦合的同步調(diào)用的操作,都是通過(guò)發(fā)出異步的“事件”來(lái)通知下一個(gè)業(yè)務(wù)環(huán)節(jié)。
可能你會(huì)有一個(gè)疑問(wèn),異步操作,是不是系統(tǒng)之間延遲會(huì)很長(zhǎng),其實(shí)不是,現(xiàn)在有很多成熟的消息中間件在內(nèi)網(wǎng)內(nèi)幾乎是毫秒級(jí)別的延遲,至于跨機(jī)房就看物理上的距離了。
異步操作有很多好處,這里我就不浪費(fèi)大家時(shí)間重復(fù)那些好處。使用EDA實(shí)現(xiàn)系統(tǒng)之間的一個(gè)松散的事務(wù)關(guān)系,要把控好項(xiàng)目的質(zhì)量,對(duì)系統(tǒng)的非功能需求、BUG數(shù)等等可能會(huì)影響業(yè)務(wù)操作中斷的地方都要建立起適當(dāng)?shù)臋C(jī)制,讓這些問(wèn)題盡早的在線下解決。比如可以實(shí)施UnitTest、持續(xù)集成等一些敏捷的方法論。
6.總結(jié)
同樣一個(gè)工具在于什么人用,真正的工匠都是使用很樸實(shí)的工具來(lái)雕刻無(wú)法超越的藝術(shù)品,這就是工匠情懷。最近對(duì)工匠情懷感受越來(lái)越深,一直以為自己是一個(gè)比較喜歡專(zhuān)的人,這是不是偏離了一個(gè)大的方向沖進(jìn)了一個(gè)小胡同,直到最近我才領(lǐng)悟,這其實(shí)是”軟件工匠“的精神。但是這不代表不考慮全局,這只是一種情懷,一種態(tài)度,對(duì)于架構(gòu)也是,對(duì)于代碼也是,不要認(rèn)為那些看似無(wú)關(guān)緊要的問(wèn)題就忽視它,帶著工匠精神雕刻它。
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
訓(xùn)練與驗(yàn)證損失驟升:機(jī)器學(xué)習(xí)訓(xùn)練中的異常診斷與解決方案 在機(jī)器學(xué)習(xí)模型訓(xùn)練過(guò)程中,“損失曲線” 是反映模型學(xué)習(xí)狀態(tài)的核心指 ...
2025-09-19解析 DataHub 與 Kafka:數(shù)據(jù)生態(tài)中兩類(lèi)核心工具的差異與協(xié)同 在數(shù)字化轉(zhuǎn)型加速的今天,企業(yè)對(duì)數(shù)據(jù)的需求已從 “存儲(chǔ)” 轉(zhuǎn)向 “ ...
2025-09-19CDA 數(shù)據(jù)分析師:讓統(tǒng)計(jì)基本概念成為業(yè)務(wù)決策的底層邏輯 統(tǒng)計(jì)基本概念是商業(yè)數(shù)據(jù)分析的 “基礎(chǔ)語(yǔ)言”—— 從描述數(shù)據(jù)分布的 “均 ...
2025-09-19CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫(kù)表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-19SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎(chǔ)用法到實(shí)戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無(wú)論 ...
2025-09-18MySQL 大表拆分與關(guān)聯(lián)查詢效率:打破 “拆分必慢” 的認(rèn)知誤區(qū) 在 MySQL 數(shù)據(jù)庫(kù)管理中,“大表” 始終是性能優(yōu)化繞不開(kāi)的話題。 ...
2025-09-18DSGE 模型中的 Et:理性預(yù)期算子的內(nèi)涵、作用與應(yīng)用解析 動(dòng)態(tài)隨機(jī)一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開(kāi)始提取前,需先判斷 TIF 文件的類(lèi)型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價(jià)值的專(zhuān)業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫(kù)表、Excel 表、 ...
2025-09-17Excel 導(dǎo)入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實(shí)戰(zhàn)應(yīng)用 在用 Python(如 pandas 庫(kù))處理 Excel 數(shù)據(jù)時(shí),“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗(yàn)與 t 檢驗(yàn):差異、適用場(chǎng)景與實(shí)踐應(yīng)用 在數(shù)據(jù)分析與統(tǒng)計(jì)學(xué)領(lǐng)域,假設(shè)檢驗(yàn)是驗(yàn)證研究假設(shè)、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專(zhuān)業(yè)操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲(chǔ)的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計(jì)劃中 rows 數(shù)量的準(zhǔn)確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計(jì)劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對(duì)象的 text 與 content:區(qū)別、場(chǎng)景與實(shí)踐指南 在 Python 進(jìn)行 HTTP 網(wǎng)絡(luò)請(qǐng)求開(kāi)發(fā)時(shí)(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價(jià)值的核心操盤(pán)手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫(kù)表)是企業(yè)最基礎(chǔ)、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請(qǐng)求工具對(duì)比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請(qǐng)求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)的科學(xué)計(jì)數(shù)法問(wèn)題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長(zhǎng)浮點(diǎn)數(shù)據(jù)時(shí)的科學(xué)計(jì)數(shù)法問(wèn)題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務(wù)數(shù)據(jù)分析步驟的落地者與價(jià)值優(yōu)化者 業(yè)務(wù)數(shù)據(jù)分析是企業(yè)解決日常運(yùn)營(yíng)問(wèn)題、提升執(zhí)行效率的核心手段,其價(jià)值 ...
2025-09-12用 SQL 驗(yàn)證業(yè)務(wù)邏輯:從規(guī)則拆解到數(shù)據(jù)把關(guān)的實(shí)戰(zhàn)指南 在業(yè)務(wù)系統(tǒng)落地過(guò)程中,“業(yè)務(wù)邏輯” 是連接 “需求設(shè)計(jì)” 與 “用戶體驗(yàn) ...
2025-09-11塔吉特百貨孕婦營(yíng)銷(xiāo)案例:數(shù)據(jù)驅(qū)動(dòng)下的精準(zhǔn)零售革命與啟示 在零售行業(yè) “流量紅利見(jiàn)頂” 的當(dāng)下,精準(zhǔn)營(yíng)銷(xiāo)成為企業(yè)突圍的核心方 ...
2025-09-11