《實現(xiàn)領(lǐng)域驅(qū)動設(shè)計》拆書稿 第8章 領(lǐng)域事件

image.png

拆書稿

一、領(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)域事件的目的?

  1. 解耦
  2. 使用領(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)暴過程:

  1. 尋找領(lǐng)域事件
  2. 尋找命令和角色
  3. 尋找領(lǐng)域模型和聚合
  4. 劃分子域和限界上下文

推薦閱讀

https://www.cnblogs.com/sheng-jie/p/7124727.html
https://juejin.im/post/5dde595a5188256ea364efbf
http://zhangyi.xyz/event-storming-distill/

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容