企業(yè)在創(chuàng)建和開發(fā)微服務(wù)的過程中,最困難的問題之一就是他們的數(shù)據(jù)。如果我們采用領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(Domain-Driven Design,DDD)來分析業(yè)務(wù)領(lǐng)域并剖析數(shù)據(jù)所代表的含義,將會有助于實(shí)現(xiàn)微服務(wù)架構(gòu),Christian Posta在一個(gè)關(guān)于微服務(wù)實(shí)現(xiàn)的系列博客文章中闡述了該理念。
Posta是Red Hat的中間件主架構(gòu)師,對于他來說,選擇微服務(wù)架構(gòu)的主要原因在于這種架構(gòu)能夠讓負(fù)責(zé)系統(tǒng)不同組成部分的團(tuán)隊(duì)按照不同的進(jìn)度來開展工作,并且能夠讓他們之間的相互干擾達(dá)到最小。當(dāng)按照這種方式來組織團(tuán)隊(duì)的時(shí)候,系統(tǒng)架構(gòu)能夠反映出這種變化,并且會向微服務(wù)架構(gòu)來演化。
但是,如何讓團(tuán)隊(duì)之間的這種自治真正運(yùn)轉(zhuǎn)起來,這一點(diǎn)其實(shí)并不簡單。在單體架構(gòu)中,通常會使用事務(wù)并且只有一個(gè)數(shù)據(jù)庫,如果每個(gè)服務(wù)都具有一個(gè)數(shù)據(jù)庫話,那么這會變成一項(xiàng)挑戰(zhàn),對于傳統(tǒng)的企業(yè)來講更是如此。
Posta指出,在實(shí)現(xiàn)微服務(wù)方面,互聯(lián)網(wǎng)公司和傳統(tǒng)企業(yè)之間有著巨大的差異。互聯(lián)網(wǎng)公司采用微服務(wù)的目的主要是解決解決大量數(shù)據(jù)和擴(kuò)展性的問題,而傳統(tǒng)企業(yè)要同時(shí)處理業(yè)務(wù)和擴(kuò)展性方面的復(fù)雜性。播放影片或發(fā)送tweet的復(fù)雜性要遠(yuǎn)遠(yuǎn)低于保險(xiǎn)索賠系統(tǒng)的復(fù)雜性。
在為相對復(fù)雜的企業(yè)域構(gòu)建微服務(wù)時(shí),我們需要找到在這個(gè)域中不同責(zé)任的邊界。在每個(gè)邊界中,我們會創(chuàng)建領(lǐng)域模型,這個(gè)模型是針對業(yè)務(wù)責(zé)任所設(shè)計(jì)的,并反映了這種業(yè)務(wù)責(zé)任。針對每個(gè)邊界的數(shù)據(jù)模型會由同一個(gè)邊界中的領(lǐng)域模型來驅(qū)動(dòng)。采用DDD的方式我們能夠找到這些邊界,并會為每個(gè)邊界創(chuàng)建一個(gè)有界上下文(bounded context),每個(gè)上下文將會成為一個(gè)微服務(wù)。
在Posta的經(jīng)驗(yàn)中,開發(fā)人員在構(gòu)建分布式系統(tǒng)時(shí),會傾向于假設(shè)只有一個(gè)關(guān)系型數(shù)據(jù)庫,并試圖將網(wǎng)絡(luò)的不穩(wěn)定性抽象出來。跨多個(gè)服務(wù)所帶來的分布式數(shù)據(jù)問題通常會通過二階段提交來解決。與這種做法不同,Posta相信,我們必須要尋找每個(gè)有界上下文中的事務(wù)性邊界,并找到滿足業(yè)務(wù)限制和不變量的最小原子單元,不要讓事務(wù)傳播到其他的上下文之中。
我們還需要有一種機(jī)制,能夠讓服務(wù)通知其他的服務(wù)發(fā)生了什么,針對這種需求,Posta推薦使用事件。我們的服務(wù)會發(fā)布事件,描述在這個(gè)域中發(fā)生了什么,其他的服務(wù)會讀取這些事件,調(diào)整它們自己的模型并將變更進(jìn)行持久化。
關(guān)于這些理念的更深入描述,Posta引用了Vaughn Vernon發(fā)布的一系列博客文章,這些文章基于DDD理念,描述了聚集、事務(wù)邊界和有界上下文。
查看英文原文:Data is the Hard Part Working with Microservices