這一節(jié)目的是想強(qiáng)調(diào)對現(xiàn)在系統(tǒng)進(jìn)行遷移的時(shí)候要考慮服務(wù)的層次,不要只進(jìn)行一個(gè)簡單的搬移代碼,這個(gè)時(shí)候是一個(gè)對代碼進(jìn)行重構(gòu)的好機(jī)會(huì),該劃分層次的要?jiǎng)澐謱哟危撟x寫分離的要讀寫分離,要重點(diǎn)考慮那些“業(yè)務(wù)服務(wù)”,需要跨越多個(gè)應(yīng)用線的邏輯。
順便說一下,還有一個(gè)重點(diǎn)就是遷移的時(shí)候還要考慮數(shù)據(jù)存儲(chǔ)方面的遷移,光代碼層面的遷移只是第一步,第二步還需要進(jìn)行數(shù)據(jù)層面的遷移。當(dāng)然這兩個(gè)大的步驟都是要通過很多次迭代完成,并且還是一個(gè)對業(yè)務(wù)、代碼進(jìn)行很好梳理和整理的好機(jī)會(huì)。
在將系統(tǒng)進(jìn)行服務(wù)化的時(shí)候要考慮服務(wù)層,如果當(dāng)前沒有業(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)都是很難改變的或者壓根就無法改變的決定。所以我對這塊引起了重視,有時(shí)候你對業(yè)務(wù)在了解在熟悉依然會(huì)搞錯(cuò)職責(zé),對于這塊光憑主觀的判斷是不長遠(yuǎn)的,無發(fā)復(fù)制、無法傳播的,也無法落字成文的。
對DDD我這里就不多做介紹了,這里要強(qiáng)調(diào)是GRASP。運(yùn)用DDD可以很好的幫助我們來戰(zhàn)略性的觀察企業(yè)所坐立的領(lǐng)域,我還是很提倡DDD在公司實(shí)施的,不說DDD中的“戰(zhàn)術(shù)設(shè)計(jì)”方法論,就光說它的“戰(zhàn)略設(shè)計(jì)”方法論還是有很大作用的,讓我們可以在腦海中建立一個(gè)戰(zhàn)略性的模型。具體要不要進(jìn)行代碼層面的落地這就看實(shí)際情況了。而且DDD中的很多不錯(cuò)的思想都可以借鑒過來,包括領(lǐng)域通用語言,有了領(lǐng)域通用語言團(tuán)隊(duì)之間的溝通和交流會(huì)節(jié)省很多成本。對于新人來說,可以很快的了解公司的一些大概的業(yè)務(wù),這和“詞匯表”其實(shí)還是有區(qū)別的。
上面說了,在劃分職責(zé)的時(shí)候很多都是通過經(jīng)驗(yàn)來主觀的判斷,沒有其他的客觀證據(jù)了。那么有沒有一個(gè)不錯(cuò)的方法論或模式來指導(dǎo)我們進(jìn)行這類問題的解決呢,其實(shí)還是有的,因?yàn)樵趪馊思疫@方面已經(jīng)很成熟。
GRASP就是這樣的一套模式,它可以幫助我們進(jìn)行客觀的設(shè)計(jì)職責(zé)。到底該把這塊數(shù)據(jù)放入哪個(gè)應(yīng)用中,到底該把這個(gè)邏輯放入哪個(gè)服務(wù)中,都有指導(dǎo),包括對對象層面的設(shè)計(jì)依然可以。我們可能對“信息專家模式”都有了解,但是以往我們可能都只把它用在對象設(shè)計(jì)上,而沒有提升一個(gè)系統(tǒng)層面中考慮。那是因?yàn)槲覀円酝赡軟]有碰見很復(fù)雜的職責(zé)分配場景,只有當(dāng)出現(xià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ò)誤的決定最終是要開發(fā)人員來買單。
5.SOA分布式下的數(shù)據(jù)一致性
傳統(tǒng)分布式系統(tǒng)與當(dāng)代的面向SOA的分布式系統(tǒng)有一定區(qū)別,論概念上來講SOA是以服務(wù)為中心,既然以服務(wù)為中心就會(huì)有很多面向服務(wù)的設(shè)計(jì)原則。而傳統(tǒng)的分布式系統(tǒng)沒有服務(wù)的概念,也沒有所謂的一切皆是服務(wù)的原則。而當(dāng)代SOA則首要原則就要以服務(wù)為中心,針對服務(wù)的設(shè)計(jì)又有了很多服務(wù)設(shè)計(jì)原則。
SOA對服務(wù)還進(jìn)行了類型的劃分,按照服務(wù)的應(yīng)用層次來分類:業(yè)務(wù)服務(wù)、組合服務(wù)、應(yīng)用服務(wù),包裝服務(wù)等。再按照管理與運(yùn)維的層面來分類:控制服務(wù)、調(diào)度服務(wù)、監(jiān)控服務(wù)等等。傳統(tǒng)的分布式系統(tǒng)是沒有這些的,我們談?wù)摰氖钱?dāng)代SOA的分布式系統(tǒng),所以我們強(qiáng)調(diào)的是以服務(wù)為中心,以服務(wù)設(shè)計(jì)原則為架構(gòu)設(shè)計(jì)的指導(dǎo)要求,當(dāng)代SOA是對傳統(tǒng)分布式系統(tǒng)的一個(gè)迭代進(jìn)化,不是一個(gè)時(shí)代的產(chǎn)物,SOA更加強(qiáng)調(diào)了以服務(wù)為首要原則,已經(jīng)提升到了另外一個(gè)更加高級的層面。
本節(jié)我們交流一下在當(dāng)代SOA分布式系統(tǒng)中的數(shù)據(jù)一致性問題,在SOA中這主要涉及兩個(gè)層面來考慮,一個(gè)是服務(wù)層面、一個(gè)數(shù)據(jù)持久化層面。再按照一致性的基本要求,可以分為:讀一致性、寫一致性、會(huì)話一致性、最終一致性、實(shí)時(shí)一致性等幾個(gè)維度,當(dāng)然還有其他幾個(gè)維度的一致性要求。
我們這里重點(diǎn)討論在企業(yè)應(yīng)用中實(shí)施SOA時(shí)遇到的一些比較棘手的數(shù)據(jù)一致性問題和解決方案,對于剛才提到的幾個(gè)維度的一致性要求均具有重要的參考價(jià)值。