結合領域事件和微服務的實現領域驅動設計 - Alagarsamy

banq發表於2019-07-22

INDU Alagarsamy最近在  QCon大會紐約2019大會談到如何使用定義良好的限界上下文和事件相結合開發微服務,從而能靈活地適應業務的變化。
當你開始在乾淨和明確定義的有界上下文之間使用訊息傳遞技術進行通訊時,你可以刪除時間耦合。有界上下文提供了清晰度,每個有界上下文中的模型在邏輯上是一致的,並且可以自由發展。
例如電子商務應用程式的用例,其中“產品”是核心實體之一。產品實體是基於上下文的,對不同的域團隊意味著不同的事情,如下所示:
  • 銷售:這是一個有描述,影像和價格的東西
  • 庫存:這是一個可用或不可用的東西
  • 運輸:這是一件需要包裝的重量和尺寸的東西

建立統一模型很難,在業務領域之間找到正確的界限可能是一個挑戰。她建議可以根據團隊和部門拆分領域模型,以幫助更好地組織模型。它也可以根據系統中的業務流程進行拆分。

Alagarsamy討論了有界上下文之間如何透過命令和事件相互通訊。事件作為不同有界上下文之間的通訊機制是有用的。它們有助於最小化有界上下文之間的時間耦合。命令可在一個有界上下文內用作通訊方式。一旦為事件和命令建模,編寫程式碼就會變得簡單得多。在需求收集階段,在業務需求描述中查詢關鍵詞“when”; 這通常表示業務活動或事件。

使用航空公司應用程式的例子,當飛機型別改變時:
  • 透過新的預訂建議通知乘客
  • 乘客可以取消航班
  • 乘客可以接受建議的預訂


事件和訊息如何與應用程式中的業務流程相關聯?業務流程可以由來自不同有界上下文的事件觸發。多條訊息可以參與業務流程。在設計訊息時,使它們不可變,即擺脫公共 setter函式。而是在領域類的建構函式中設定屬性。

Saga模式可用於管理在同一事務中的多個訊息。該模式允許您在業務流程中的任何步驟不成功的情況下采取補償措施。

事件風暴是整體需求分析工作中的另一個關鍵步驟。它是開發團隊與業務利益相關者用於探索複雜業務領域的協作技術。使用事件風暴技術進行領域建模有助於識別事件發生的時間以及應用程式應採取的操作。這些即是命令與事件。
對域模型中的各種元素使用適當的命名約定也很重要。為程式碼處理程式提供正確的名稱,並在程式碼審查和同行評審期間驗證名稱。檢查事件,類和處理程式的語言和命名。
模型並不完美,團隊應該遵循下面這些實踐,以確保他們的領域模型與業務目標和要求保持一致。

  • 與領域專家交流。與他們的事件風暴。
  • 透過對領域語言的痴迷來進化和重構。
  • 爭取自治。使用事件在有界上下文之間進行通訊。

相關文章