一個對象從創建開始到消亡會經歷很多事件,以前我們是在每次對象參與完一個業務動作后把對象的最新狀態持久化保存到數據庫中,也就是說我們的數據庫中的數據是反映了對象的當前最新的狀態。而事件溯源則相反,不是保存對象的最新狀態,而是保存這個對象所經歷的每個事件,所有的由對象產生的事件會按照時間先后順序有序的存放在數據庫中。可以看出,事件溯源的這種做法是更符合事實觀的,因為它完整的描述了對象的整個生命周期過程中所經歷的所有事件。
那么,事件到底如何影響一個領域對象的狀態的呢?很簡單,當我們在觸發某個領域對象的某個行為時,該領域對象會先產生一個事件,然后該對象自己響應該事件並更新其自己的狀態,同時我們還會持久化在該對象上所發生的每一個事件;這樣當我們要重新得到該對象的最新狀態時,只要先創建一個空的對象,然后將和該對象相關的所有事件按照事件發生先后順序從先到后再全部應用一遍即可還原得到該對象的最新狀態,這個過程就是所謂的事件溯源;
另一方面,因為是用事件來表示對象的狀態,而事件是只會增加不會修改。這就能讓數據庫里的表示對象的數據非常穩定,不可能存在DELETE或UPDATE等操作。因為一個事件就是表示一個事實,事實是不能被磨滅或修改的。這種特性可以讓領域模型非常穩定,在數據庫級別不會產生並發更新同一條數據的問題;其實CAP定理之所以做不到,根本原因也是由於數據可以被修改;現在通過事件溯源,我們實現CAP或許就成為了可能;
我們可以看到,基於這樣的設計,領域對象的狀態完全是由事件驅動的。不僅如此,事件還可以被事件總線分發出去,通知領域模型外的一切事件響應者發生了什么,基於這種Publish-Subscribe的通信模式,我們可以最大限度的實現系統的松耦合。
