近年來隨著微服務架構與容器化技術迅速發展,促成金融業發展新一代企業整合中台,包含業務中台、數據中台與技術中台。 中台的本質是業務模型,而微服務是業務模型的落地方法,領域驅動設計將業務抽象,建立領域模型,維持業務和程式的邏輯一致性,進而指導中台如何建立業務模型。 而微服務設計需考量獨立開發、測試、建置和部署,並實現去中心化數據管理和高內聚低耦合特性,領域驅動設計也是指導微服務設計的方法論。 本次我們將以應用實例介紹金融業導入領域驅動設計的實踐旅程。

會議資訊

  • 會議名稱:Domain Driven Design Taiwan 領域驅動設計年會
  • 演講時間:2020-11-27 15:00
  • 相關連結:Youtube

這場演講主題是關於金融業導入領域驅動設計 (Domain-Driven Design, DDD) 的應用實例

演講內容主要涵蓋了以下幾個重點:

  • 軟體架構的演進:演講首先回顧了軟體架構的三個階段,從單體架構服務導向架構 (SOA),再到近年來越來越流行的微服務架構。架構的演變是為了應對業務變化和高併發等需求,從集中式走向分散式。
  • 中台架構:為了設計新一代的企業整合中台,我們將架構分為前台(通路)、後台(核心系統)和中台。中台架構包含數據中台、業務中台和技術中台。我們透過 DDD 來拆解業務領域的服務。
  • DDD、中台與微服務的關聯性:闡述了 DDD、中台和微服務之間的關係。中台是一個企業級的能力復用平台,將企業的業務服務抽象化並共享通用部分。微服務則是中台業務模型的系統實現方式。而 DDD 透過戰略設計(業務模型切割)和戰術設計(API 和領域物件設計)指導中台的業務模型抽象和微服務的架構設計。我們認為 DDD 是實作中台和微服務的良好方法。
  • 導入 DDD 的動機與計畫:我們在去年底開始了解 DDD 這個方法論,並組建團隊進行研究。導入 DDD 的目的是希望在進行中台的微服務切割時能夠更精確地劃分服務邊界,使得服務可以更容易地組裝和成為可復用的模組。我們的導入計畫包含在內部培養 DDD 種子成員、舉辦教育訓練、以及與子公司合辦 workshop 以實際體驗 DDD 的應用。
  • 導入 DDD 的關鍵:導入 DDD 的一個重要關鍵是「One Team」,也就是需要將資深的 BA、SA、SD 和架構師等所有相關角色都邀請參與進來,共同參與讀書會和 workshop。如果只有開發團隊自己進行 DDD,可能會因為對業務領域知識理解不足而難以成功。
  • 透過 Workshop 體驗 DDD:為了更好地掌握 DDD 的概念,我們開始與子公司合辦 workshop,例如進行事件風暴 (Event Storming)命令風暴 (Command Storming),然後再尋找聚合 (Aggregate)。
  • 共通語言 (Ubiquitous Language):透過 DDD 的實踐,團隊成員(包含業務人員和開發人員)可以形成通用的語言,避免過去需求傳達過程中可能發生的資訊衰減和理解偏差。大家在討論業務領域的術語 (Term) 時,可以有共同的理解。
  • DDD 與微服務邊界的劃分:在進行尋找聚合的過程中,我們發現聚合自然形成了微服務的邊界。這有助於解決設計微服務時如何劃分邊界的問題.
  • DDD 的產出:在完成 DDD 的初步活動後,可以得到 API 的清單和規格 (SP)。基於領域模型,可以將聚合轉化為微服務,事件 (event) 和命令 (command) 可以對應到程式碼,同時可以設計 API 的介面。
  • 案例分享:提到一個內部的專案,其中的 order 服務模組就是使用 DDD 拆解出來的,聽眾可以參考該專案的程式結構來了解 DDD 的實際應用。透過 DDD 設計的系統,其業務語言與程式碼是一致的,可以從程式碼的命令 (command) 就理解服務的業務邏輯。
  • DDD 與敏捷開發 (Agile):有同仁曾質疑 DDD 是否與敏捷開發相似,認為敏捷開發也包含 workshop、使用者故事 (user story) 和用戶旅程等活動。演講者解釋,DDD 的重點在於有效地梳理使用者需求並劃分領域邊界,這是單純的敏捷開發方法可能缺乏的。
  • DDD 與微服務的關係:DDD 是一種軟體分析設計的方法,而微服務是一種架構風格,兩者並不衝突。我引用一個觀點,認為「microservice 少了 DDD 可能會變成一個分散式單體」,意指如果設計微服務的過程中缺乏 DDD 的領域劃分,最終可能只是將單體應用分散部署而已,並未真正實現微服務的優勢。

這場演講分享了我們導入 DDD 的經驗,強調了 DDD 在理解業務領域、建立通用語言、劃分微服務邊界以及最終構建更符合業務需求的軟體系統方面的重要性。分享了我們在導入過程中遇到的挑戰和學習,以及未來希望透過 DDD 實現更彈性、可擴展的金融服務架構的願景。