網(wǎng)店在創(chuàng)建一個(gè)訂單時(shí),采用如下步驟去驗(yàn)證一個(gè)客戶的信用額度:
以“NEW”狀態(tài)創(chuàng)建的Order聚合,并發(fā)布一個(gè)OrderCreated事件;
Customer聚合消費(fèi)OrderCreated事件,為訂單保存信用值,并發(fā)布CreditReserved事件;
Order聚合消費(fèi)CreditReserved事件,并將自身狀態(tài)更改為“APPROVED”。
在因資金不足而導(dǎo)致信用額度檢查失敗時(shí),Customer聚合就會(huì)發(fā)布一個(gè)CreditLimitExceeded事件。該事件并不對(duì)應(yīng)于一個(gè)狀態(tài)改變,而是表示了違反業(yè)務(wù)規(guī)則的失敗嘗試。Order聚合消費(fèi)該事件,并將自身狀態(tài)更改為“CANCELLED”。
以微服務(wù)架構(gòu)作為事件驅(qū)動(dòng)聚合的網(wǎng)絡(luò)
在這種架構(gòu)中,每個(gè)服務(wù)的業(yè)務(wù)邏輯中包含了一個(gè)或多個(gè)聚合。每個(gè)事務(wù)通過一個(gè)服務(wù)創(chuàng)建或更新一個(gè)聚合來執(zhí)行。服務(wù)使用事件維持聚合間的數(shù)據(jù)一致性。

該方法的一個(gè)特有優(yōu)點(diǎn)是將聚合作為松耦合的構(gòu)件。聚合被部署到一個(gè)整體或是一組服務(wù)中。在一個(gè)項(xiàng)目的開始階段,開發(fā)人員可以使用整體架構(gòu)。此后,隨著應(yīng)用及開發(fā)團(tuán)隊(duì)規(guī)模的增加,開發(fā)人員可輕易地遷移到微服務(wù)架構(gòu)上。
總結(jié)
微服務(wù)架構(gòu)將應(yīng)用功能分解為服務(wù),每個(gè)服務(wù)對(duì)應(yīng)于一種業(yè)務(wù)能力。事務(wù)、領(lǐng)域模型和查詢對(duì)分解的抵制,是開發(fā)基于微服務(wù)的業(yè)務(wù)應(yīng)用時(shí)的一個(gè)挑戰(zhàn)??梢酝ㄟ^使用DDD聚合的理念對(duì)領(lǐng)域模型進(jìn)行分解。每個(gè)服務(wù)的業(yè)務(wù)邏輯構(gòu)成一個(gè)領(lǐng)域模型,每個(gè)領(lǐng)域模型由一個(gè)或更多的DDD聚合組成。
在每個(gè)服務(wù)中,一個(gè)事務(wù)建立或更新一個(gè)聚合。因?yàn)閷?duì)當(dāng)代應(yīng)用而言,兩階段提交并非是一種可行的技術(shù),我們使用事件維持聚合間(和服務(wù)間)的一致性。在本文隨后的第二部分中,我們將描述如何使用“ 時(shí)間溯源 ”實(shí)現(xiàn)一個(gè)可靠的事件驅(qū)動(dòng)架構(gòu)。我們還會(huì)展示如何在微服務(wù)架構(gòu)中使用 命令查詢職責(zé)分離 實(shí)現(xiàn)查詢。
關(guān)于本文作者

Chris Richardson 是一位程序開發(fā)人員和架構(gòu)師。他還是一名Java冠軍程序員(Java Champion),同時(shí)也是《 用輕量級(jí)框架開發(fā)企業(yè)應(yīng)用 》一書的作者。這本書的內(nèi)容是關(guān)于如何使用Spring和Hibernate等架構(gòu)去構(gòu)建企業(yè)Java應(yīng)用的。Chris也是CloudFoundry.com的創(chuàng)始人。他還擔(dān)任了一些企業(yè)的顧問,指導(dǎo)企業(yè)如何去改進(jìn)應(yīng)用的開發(fā)和部署過程。他目前正致力于發(fā)展他的第三個(gè)初創(chuàng)企業(yè)。讀者可以通過Twitter賬號(hào) @crichardson 和 Eventuate 網(wǎng)站聯(lián)系到Chris。
查看英文原文: Developing Transactional Microservices Using Aggregates, Event Sourcing and CQRS - Part 1
感謝夏雪對(duì)本文的審校。