1. 程式人生 > 程式設計 >基於Akka的分散式領域驅動設計

基於Akka的分散式領域驅動設計

當我們要使用Akka相關工具與技術時,可使用DDD來幫助我們設計Actor,設計組成整個系統的其它元件,將應用程式分隔為較小的系統的方式,瞭解子系統的邊界以及它們如何互動。

DDD介紹

DDD是一套軟體架構的指導原則,DDD中最重要的概念是域模型(Domain Model)。“域”是構成嘗試建模的業務或領域的一組要求,約束和概念。DDD中,我們專注涉及的業務領域,並圍繞它構建軟體系統模型。

  • 構建DDD的過程需要該領域的專家參與進來,無需懂計算機,但可以通過我們開發的新語言相互交流
  • DDD專注於構建能持續發展的模型,不是一個一直都不變的模型

DDD好處

DDD可以幫助我們區分系統中的業務區域部分和基礎架構部分,幫助我們爭取的在它們周圍創造正確的抽象層,這樣就不會觸及邊界。

DDD的目標是將較大的領域業務分解成更小,更易於管理的業務塊,然後分別對這些小的業務塊進行構建,這樣開發的系統不僅對我們更好理解,對領域專家來說也更好理解。

DDD元件

  • 域實體(Entity):實體一般是可以變的,具有唯一可識別的標識,可以直接對映到Akka actor中。actor就是管理可變狀態的,並且系統中的actor都可以使用路徑對其進行唯一標識。
  • 域值物件:值物件一般沒有唯一標識,兩者的值相同即認為是相同的,值物件是不可變的。可以作為Akka的訊息。
  • 聚合:應用程式內物件的集合,每個聚合都會繫結到聚合根上,通過聚合根可以訪問聚合中的一些元素。在Akka中就是父actor與子actor的關係。刪除/停止父actor,子actor也會隨之刪除/停止
  • 倉儲:倉儲的目的是從基礎架構中抽象出抽象層,建立一個將域和基礎架構隔離開的系統,無需關係是使用SQL資料庫,NoSQL資料庫,資料檔案或者其它結構。在Akka中有一組Person聚合,則可能有PersonRepository來管理這些聚合。PersonRepository應該也是一個actor。
  • 域服務:有些操作可能涉及到多個聚合根,這種情況下,我們可以引入一種被稱為Service的概念。服務也是一個域物件,但是用於處理不適合作為聚合的操作,該服務可以根據需要與聚合進行互動。

有界上下文

任何有一定規模的系統都將自然分解為更小的元件,這些元件可以有自己的域,有自己的邊界。

在Akka中,可以在系統中建立一系列頂級的Actor,讓每一個actor專門用於一個特定的有界上下文,有界上下文標識彼此隔離的而服務。

這種有界上下文與現代微服務體系結構非常相似,這種情況下,每個微服務通常代表一個有界上下文。使用Akka Clustering,叢集Sharding和Akka Http這樣的工具可以將一個大型系統拆分為單獨的有界上下文。

部署Actor的方式只是一個實現細節,而不是應用程式的固有部分,這樣可以實現獨立的縮放系統的不同部分

結論

瞭解Akka的actor模型,並知道如何與DDD結合觜火猴,大家便有了可以構建強大的、可擴充套件的、高度可維護的系統的必要元件,可以遵循這些已經建立好的模式保證系統的順利構建。

學習Akka設計的學習筆記:

參考《Akka 應用模式》