August 16 10:03~11:33
▲圖1:Clean Architecture四層架構
前言
上周末上完【事件溯源與命令查詢責任分離架構實作班】首發團,有一位認識近十年的老學員告訴Teddy:「這是我上過泰迪軟體所有的課裡面最難的一門課。以前的課我回去都可以直接挑選某部分在工作上應用,這個Event Sourcing加上CQRS我一下子想不到可以用在哪裡。」
Event Sourcing真的比State Sourcing(OR-Mapping)要困難嗎?這次分兩集談一下這個問題,這一集先從寫入(Command/ Write Model)來比較兩者的異同,下一集再來討論讀取。
***
只是不一樣
Teddy覺得這位老學員之所以會覺得難,主要的原因是在課程中Teddy把近幾年所學關於Event Sourcing, CQRS, DDD, Clean Architecture的全部重點濃縮在兩天內講完,所以資訊密度比較高。至於Event Sourcing本身Teddy認為並沒有比State Sourcing要難,困難的地方在於你會想應用Event Sourcing的場景通常是在分散式系統或套用微服務架構,是這個「分散式環境」讓你誤以為Event Sourcing比較難,而非它本身真的比較難。
和State Sourcing相比,Event Sourcing只是做法不同,並沒有比較難;它們只是一種儲存系統狀態的方法。
***
從Clean Architecture看Event Sourcing
請參考圖1的Clean Architecture架構圖:
Entity Layer:Entity Layer首先反映問題領域的重要概念與關聯,理論上這一層的物件根本不管物件如何儲存。但在程式實作面,Event Sourcing對Entity Layer的實作方式的確會產生影響,但也僅止於影響Aggregate Root,程式撰寫風格要改成如圖2的event sourced coding style:任何改變狀態的public method,都呼叫apply方法,並傳給它一個(或多個)代表狀態改變的領域事件。然後在event handler(圖2中的when方法)中實作程式邏輯。這種程式撰寫風格,也可以適用state sourcing,所以也不是說寫成這樣就一定要用event sourcing。
▲圖2:Event Sourced Aggregate Root撰寫風格
***
Use Case Layer:請參考圖3,Use Case透過注入的Repository來存取Aggregate,Use Case並不知道所注入的Repository是一個State Sourcing Repository還是Event Sourcing Repository。也就是說,是否採用Event Sourcing並不會影響到Use Case。
▲圖3:Use Case範例
***
Interface Adapter Layer:請參考圖4,Interface Adapter Layer左方是State Sourced Repository的實作,右方是Event Sourcing Repository實作。從寫入(Write Model)的角度來看,如果是採用OR-Mapping的State Sourced Repository,由於還要寫一堆ORM設定或是下SQL寫入資料庫,實作方式其實比Event Sourced Repository還要複雜,並沒有Event Sourcing的儲存方式比State Sourcing要困難的問題。
▲圖4:Interface Adapter Layer與DB & Driver Layer
***
DB & Driver:請參考圖4,DB & Driver Layer左方是State Sourced Database,右方是Event Sourced Database。如果左方採用關聯式資料庫,將Aggregate寫入資料庫表格的同時,需要在同一個交易中把領域事件也一併寫入資料庫的Outbox表格。至於右方的Event Store Database,由於只需要寫入領域事件,不需要像關連式資料庫一樣寫入時套用Transactional Outbox設計模式,所以反而比較簡單。
***
結論
經過以上分析,從讀寫分離的角度來看,Event Sourcing在寫入端其實比State Sourcing還要簡單。但就像Teddy經常說的「能量不滅」,寫入比較簡單,通常讀取就比較困難。下一集從讀取模型來比較Event Sourcing和State Sourcing。
***
工商服務
最後打個廣告,10月份【領事件溯源與命令查詢責任分離架構實作班】招生中。
***
友藏內心獨白:Event Sourcing是一種第一次會痛,第二次會爽的技術 XDD。
沒有留言:
張貼留言