
拆書稿
一、領(lǐng)域事件是什么?
定義:
領(lǐng)域?qū)<宜P(guān)心的(需要跟蹤的、希望被通知的、會引起其他模型對象改變狀態(tài)的)發(fā)生在領(lǐng)域中的一些事件。領(lǐng)域事件是用來捕獲領(lǐng)域中發(fā)生的具有業(yè)務(wù)價值的一些事情。
二、怎么辨別出領(lǐng)域事件?
注意專家說的關(guān)鍵詞匯:
- “當(dāng)......”
- “如果發(fā)生......”
- “當(dāng).......的時候,請通知我”
- “發(fā)生.......時”
三、領(lǐng)域事件應(yīng)該具備的屬性?
一些概念
事件源事件流
一些屬性
名字、發(fā)生時間、身份標(biāo)識
四、領(lǐng)域事件的一些概念和我們平時理解基于中間件事件的區(qū)別
發(fā)布-訂閱模式
是一個泛的概念
五、向遠(yuǎn)程限界上下文發(fā)布領(lǐng)域事件
1、消息設(shè)施的一致性
- 領(lǐng)域模型和消息設(shè)施共享持久化存儲
- 領(lǐng)域模型的持久化存儲和消息持久化存儲由全局的XA事務(wù)(兩階段提交)所控制
在領(lǐng)域模型的持久化存儲中,創(chuàng)建一個特殊的存儲區(qū)域(比如一張數(shù)據(jù)庫表),該區(qū)域- 用于存儲領(lǐng)域事件;
2、自治服務(wù)和系統(tǒng)
自治性
可以通過異步的消息來達(dá)到更高層次的獨立性
3、容許時延
我們必須得知道業(yè)務(wù)方多長的時間延遲是可以接受的
六、事件存儲能給我們帶來什么好處?
- 將事件存儲作為一個消息隊列來使用,該消息隊列的作用是將所有的領(lǐng)域事件通過消息設(shè)施發(fā)布出去。
- 將相同的事件存儲用于基于REST的事件通知
- 檢查由模型的命令方法所產(chǎn)生的所有結(jié)果的歷史記錄;跟蹤bug
- 使用事件存儲中的數(shù)據(jù)來進(jìn)行業(yè)務(wù)預(yù)測和分析;
- 當(dāng)從資源庫中獲取一個聚合實例時,使用事件來重建該聚合實例;
- 撤銷對聚合的操作;
七、轉(zhuǎn)發(fā)存儲事件的架構(gòu)風(fēng)格
1、基于REST資源的方式
主要是"拉"的方式
基于REST的事件通知,可以參考基于Atom的通知日志的優(yōu)缺點討論
Jim Webber的演講【W(wǎng)ebber, REST & DDD】
2、基于消息中間件的方式
主要是"推"的方式
讀后思考
我們從一個更高的層次來認(rèn)識事件,之前我們在系統(tǒng)開發(fā)中一提到事件馬上會想到的是消息中間件。本章就從領(lǐng)域的高度來重新帶你認(rèn)識事件。這時你會從平時的深井中跳出來,原來消息中間件只是實現(xiàn)事件轉(zhuǎn)發(fā)的一種方式而已。在系統(tǒng)的設(shè)計中我們可以在更抽象更頂層的角度來設(shè)計事件的產(chǎn)生、存儲、轉(zhuǎn)發(fā),從而使業(yè)務(wù)流的設(shè)計更加清晰合理。
1、引入領(lǐng)域事件的目的?
- 解耦
- 使用領(lǐng)域事件進(jìn)行事務(wù)的拆分,通過引入事件存儲,來實現(xiàn)數(shù)據(jù)的最終一致性。
2、領(lǐng)域事件有哪些行為?
領(lǐng)域事件 = 事件發(fā)布 + 事件存儲 + 事件分發(fā) + 事件處理
3、如何命名領(lǐng)域事件?
事件代表的是一個已經(jīng)發(fā)生的事實(fact),所以往往用動詞的過去時態(tài)來表達(dá),一般是“產(chǎn)生事件的對象名稱+完成的動作的過去式”的形式,例如:訂單已發(fā)貨(OrderDispatchedEvent)、訂單已收貨和訂單已確認(rèn)(OrderConfirmedEvent)等事件。
4、如何找出領(lǐng)域事件?
首先要明白:同一個實體在不同的問題域下領(lǐng)域事件是不同的。
比如:問診業(yè)務(wù),醫(yī)生的場景下關(guān)注的是:病情已確診,處方已開具;患者的場景下關(guān)注的是:醫(yī)生已接診,病情已確認(rèn),藥品已收到;
下面都可以是領(lǐng)域事件:
- 業(yè)務(wù)流程中的一個步驟:問診結(jié)束- 定時發(fā)生的事情:醫(yī)生結(jié)薪每晚對賬完成;
- 一個事件發(fā)生后引發(fā)的后續(xù)動作:隨訪對話結(jié)束后24小時自動關(guān)閉;
業(yè)務(wù)的因果關(guān)系
一系列"關(guān)鍵事件"連接起來,會形成明顯的基于一條時間線的狀態(tài)遷移過程,這種狀態(tài)遷移過程體現(xiàn)了業(yè)務(wù)的因果關(guān)系。導(dǎo)致事件發(fā)生的因,在事件風(fēng)暴中被稱之為命令(Command),相當(dāng)于事件的發(fā)布者。命令往往由動賓短語組成,例如Place Order、Send Invitation等。
事件由命令觸發(fā),命令由參與者(Actor)發(fā)起
參與者的引入就將對事件的分析與業(yè)務(wù)場景結(jié)合起來,這就驅(qū)動著參與事件風(fēng)暴的所有成員要對業(yè)務(wù)達(dá)成一致(形成統(tǒng)一語言),并從用戶體驗(User Experience)的角度去分析每個業(yè)務(wù)場景。這時作為參與者對業(yè)務(wù)的參與,就不再是發(fā)起一個業(yè)務(wù)流程,執(zhí)行一個業(yè)務(wù)動作,而是做出決策(Decision)。
在事件風(fēng)暴中,決策就是命令,但“決策”更具有擬人化的意義,正如在現(xiàn)實生活中,當(dāng)我們做出決策時,需要如下兩方面數(shù)據(jù)的支撐:
- 信息:必須基于足夠充分的信息才能做出正確的決策,提供這些信息的對象就稱之為讀模型(Read Model)
- 策略:一旦做出決策就會觸發(fā)一個業(yè)務(wù)流程,流程的執(zhí)行暗含了業(yè)務(wù)規(guī)則,該規(guī)則被命名為策略(Policy)
5、事件風(fēng)暴
事件風(fēng)暴是一種快速探索復(fù)雜業(yè)務(wù)領(lǐng)域和對領(lǐng)域建模的實踐,它建立了以"領(lǐng)域事件"為核心的建模思路。
事件風(fēng)暴過程:
- 尋找領(lǐng)域事件
- 尋找命令和角色
- 尋找領(lǐng)域模型和聚合
- 劃分子域和限界上下文
推薦閱讀
https://www.cnblogs.com/sheng-jie/p/7124727.html
https://juejin.im/post/5dde595a5188256ea364efbf
http://zhangyi.xyz/event-storming-distill/