Udi Dahan曾在2017年阿姆斯特丹的DDD歐洲年會上發表過一篇演講——if (domain logic) then CQRS, or Saga。視頻是UP主從Youtube搬運的,我聽力水平通常,因此如下內容有所偏頗的話,還請見諒。git
在演講中,他提到了Sandbox、Private Domain、Public Domain和Collaboration Domain等一些概念,爲更好地應用DDD開闢了不一樣視角。如下即是個人思考與收穫。github
Udi用級聯刪除的例子,引出了沙盒Sandbox。錯誤的級聯刪除操做,特別是在數據庫中Table級別上的刪除操做,對任何一個系統而言均可謂滅頂之災。因此瓜熟蒂落的,咱們會使用給數據行打上某種刪除標誌的方法,稱之爲「軟刪除」,避免數據被完全刪除。這就象操做系統裏的回收站同樣,給了咱們一次反悔的機會。若是在全部的軟件系統裏都有這樣一個安全沙盒,是否是就徹底解決了刪除問題?數據庫
隨後,Udi用博客做爲例子,引出了Private Domain和Public Domain的概念,並闡述了Sandbox與兩者之間的聯繫。一篇隨筆被正式發佈前,博主能夠在編輯頁面隨便折騰。而在隨筆正式發佈後,全部的修改和刪除操做就須要慎重了。此處,發佈前的隨筆處於Private Domain,發佈後則進入了Public Domain。對處於Private Domain範圍內的私有數據,咱們能夠隨意地增刪查改,而不用顧忌任何的業務規則和約束。而當私有數據被推送到Public Domain時,則必須順利經過各類規則的審覈與驗證,進而成爲構成系統的固定組成部分。其中,每一個Private Domian對應一個Sandbox,用戶能夠隨心所欲,而沒必要擔憂對系統形成實質影響。安全
Udi接着商品被刪除的例子,延伸到購物車中已加入的商品售罄或被停售的狀況,提出Collaboration Domain的概念。在競態條件(即併發條件下的競爭條件)下,即代表有多個參與者須要對同一個數據進行操做,此時屬處的領域即Collaboration Domain。這樣的協做領域,一般能夠圍繞if語句進行發掘。有if判斷涉及其餘的實體,則一般代表該數據也可能會被其餘參與者改變。此時,CQRS成爲很天然的選擇。由於命令執行的環境是通過事先檢驗的,因此命令老是能成功執行。在這樣的設定下,把一個用戶下單的操做分割爲多個步驟,在放入購物車和提交訂單時分別進行一次商品有效性的檢驗。併發
爲了減小檢驗的次數,Udi借Shopping Cart Timeout的例子引出了Collaboration Timeout的概念。給購物車一個活動狀態的超時設定:用戶放入商品時,購物車進入激活狀態,跨入協做領域,此時因商品在售,訂單能夠成功提交;用戶未在超時前提交訂單的,購物車進入失活狀態,退出協做領域,以後商品將因售罄或停售而沒法再加入購物車。框架
因爲Collaboration Domain和CQRS的存在,Udi指出,必須改變傳統的思考方式,由於Saga將更廣泛地出如今模型之中。對此不能有退縮和猶豫,應當與領域專家深刻交流,使本身也成爲業務專家,確保每一個流程都徹底可控。最後,Udi提出消息中間件是實現Saga的重要工具,因而順手推介了一下本身維護的NServiceBus框架。dom