事件溯源(event sourcing)和CQRS是在領域驅動設計(Domain-Driven Design,DDD)社區出現的兩個模式。流處理(Stream processing)構建在類似的理念上,但是它來源于不同的社區,Martin Kleppmann在今年的領域驅動設計歐洲會議的演講中,將事件溯源與流處理進行了對比。
Kleppmann之前有在互聯網公司構建大規模數據系統的背景,但是他目前就職于劍橋大學,在將企業級軟件與互聯網公司的系統進行對比的時候,Kleppmann指出,它們主要的差異在于復雜性所在的位置不同。在企業級軟件方面,復雜性主要在于領域模型和業務邏輯。在互聯網公司中,領域模型相對會比較簡單,但是它會快速產生數量非常大的數據,這導致了數據基礎設施的復雜性。盡管這兩個方面都有其復雜性,而且產生的原因各異,但是Kleppmann發現它們的解決方案是類似的,在企業級領域采用的是事件溯源,而在互聯網方面,采用的則是流處理或者不可變事件的序列(sequences of immutable events)。
Kleppmann提到了處理事件流的一個工具,那就是Kafka。最初開發它的目的在于聚集日志文件和處理事件。它是基于非常簡單的理念構造的,Kleppmann將其類比為可以附加(append)日志內容的日志文件,不過這里不斷添加的是新的消息或事件。這樣會創建出按序排列的記錄序列,它可以用來統一地處理任意事件流。Kafka一個很重要的特性就是在它跨服務器分布的時候,能夠處理大量的事件。
使用Kafka實現的一個很有意思功能就是為數據庫變更事件創建事件流,Kleppmann認為這與事件溯源非常類似,數據庫每條記錄的更新都會產生一個事件,如聚合狀態或實體的更新。通過這種方式,在發布并應用更新到本地版本的數據時,客戶可以讀取到一個事件。Kleppmann指出這種使用場景類似于數據庫復制(database replication),在數據庫復制中,會首先寫入到一個主數據庫中,然后復制到備份數據庫中。
在Kafka最初所設計的使用場景中,所有的消息出現一定百分比的丟失是可以接受的,但是隨著運維經驗的不斷豐富和成熟,對持久化的預期也在提高,它的復制技術已經達到了很多關系型數據庫復制系統的水準。為Kafka添加事務支持的工作正在進行之中,它允許以原子的方式自動發布消息到多個分區。Kleppmann指出,盡管事件流和處理是非常新的技術,但是毫無疑問這種趨勢已經進入到很多數據庫之中了。
在對比事件溯源與流處理的過程中,Kleppmann發現特別有意思的一點在于這兩個類似的理念來源于兩個差異性非常大的社區,而且這兩個社區很少有交流。這表明在底層會有一些基礎的理念,而這些理念是非常重要的。
在QCon倫敦的演講中,Kleppmann討論了如何使用事件流和Kafka在異構的系統間保持數據同步。
Kleppmann演講的slides可以在該地址獲取。
明年的領域驅動設計歐洲會議計劃會在2017年的1月底舉行。
查看英文原文:Comparison of Event Sourcing with Stream Processing