細(xì)心的人可能會(huì)發(fā)現(xiàn),之前我這個(gè)圖中的領(lǐng)域?qū)嶓w對(duì)象圓其實(shí)有兩種畫法,一種是底部有一條線,另一個(gè)是左側(cè)有一條線。這樣畫的目的是為了進(jìn)一步區(qū)分實(shí)體中那些是聚合根,那些是普通實(shí)體。
那么什么是聚合根,按照我的理解,就是當(dāng)這個(gè)實(shí)體被創(chuàng)建時(shí),他可以代表這個(gè)創(chuàng)建的最關(guān)鍵的線索,就是聚合根。可能這么解釋還是感覺(jué)不明白,那么我就用一個(gè)項(xiàng)目的案例來(lái)說(shuō)明,在金融系統(tǒng)中,我們經(jīng)常有一個(gè)設(shè)計(jì)是“交易流水”,比如一筆支付單據(jù),就有一筆支付交易流水,那么這個(gè)流水就代表了這個(gè)訂單一次支付處理過(guò)程,通過(guò)這個(gè)流水以及相關(guān)聯(lián)的日志,我們可以事后得出,這筆訂單如何從一個(gè)初始狀態(tài),變?yōu)榱艘呀?jīng)支付狀態(tài),所以往往我們?yōu)榱嘶厮?,我們?huì)將這個(gè)流水以及產(chǎn)生的信息,都會(huì)持久化到數(shù)據(jù)庫(kù)中,以方便后面業(yè)務(wù)的核查。 在這里:這個(gè)支付過(guò)程和這個(gè)交易流水就是密切關(guān)聯(lián)的,可以這么說(shuō),交易流水就是為了這次支付過(guò)程而誕生的,而且我們通過(guò)這個(gè)交易流水,我們也能夠反應(yīng)當(dāng)初那個(gè)過(guò)程。在這個(gè)交易過(guò)程中,我們可以認(rèn)為這個(gè)交易流水就是聚合根,一切的開始都是從他誕生開始,事后他也代表了一次過(guò)程,那么這就是我理解的聚合根。
再回到我們實(shí)體劃分里面,你會(huì)發(fā)現(xiàn),眾多的實(shí)體的誕生,都是因?yàn)橐粋€(gè)動(dòng)作,那么如果這個(gè)實(shí)體動(dòng)作也反過(guò)來(lái)反應(yīng)一次業(yè)務(wù)動(dòng)作,那么我們就可以這個(gè)動(dòng)作為一次聚合,同時(shí)認(rèn)為這個(gè)實(shí)體是這個(gè)聚合的聚合根。
那我們?yōu)槭裁匆獏^(qū)分聚合根了?有兩方面的原因:在微服務(wù)中,為了系統(tǒng)的健壯性,我們可以要求所有的微服務(wù)都應(yīng)該滿足冪等性要求,如果所有的微服務(wù)都滿足這個(gè)特性,那么對(duì)于整體系統(tǒng)的高可用以及穩(wěn)定性都會(huì)帶來(lái)大幅度的提高,那么當(dāng)一次調(diào)用,都會(huì)產(chǎn)生一條數(shù)據(jù)以及對(duì)象代表這次調(diào)用,通過(guò)對(duì)象的去重,我們就得到了相應(yīng)服務(wù)的冪等性;第二個(gè)原因,就是通過(guò)聚合根,我們可以從數(shù)據(jù)層面就能夠反應(yīng)整個(gè)系統(tǒng)的調(diào)用過(guò)程,而且在一些特定的場(chǎng)景,我們完全可以有條件針對(duì)聚合根的數(shù)據(jù),來(lái)回溯系統(tǒng)的演進(jìn)過(guò)程。
那么針對(duì)聚合根還有幾個(gè)特性,我們需要了解一下:一次聚合的過(guò)程僅產(chǎn)生一個(gè)聚合根;聚合根也是在微服務(wù)體系內(nèi)的,不要設(shè)計(jì)跨服務(wù)的聚合根,特別不要設(shè)計(jì)長(zhǎng)事務(wù)的聚合根。
在例舉的案例里面,底部有一條線圈就是一個(gè)聚合根。

可以看到我們認(rèn)為一次Command調(diào)用就是一個(gè)聚合,Command對(duì)象就是相應(yīng)的聚合根,那么我們就可以將所有的Command對(duì)象持久化到數(shù)據(jù)庫(kù)中,這樣可以代表了整個(gè)系統(tǒng)在Command側(cè)的演進(jìn)歷史。這樣對(duì)后續(xù)業(yè)務(wù)和技術(shù)的支撐都是非常的有利。