標簽:
- Kafka,Event Sourcing
目標受眾:
- 目標受眾:系統(tǒng)架構師
關注問題:
- 在以微服務架構為代表,分布式系統(tǒng)架構越來越成為主流的當下,如何保證不同限界上下文中數(shù)據(jù)的一致性一直是系統(tǒng)架構設計上的一個主要挑戰(zhàn)。尤其是在只留存數(shù)據(jù)最終鏡像(Snapshot)的數(shù)據(jù)持久化方案下。有沒有一種方案可以讓數(shù)據(jù)同步變得簡單、可靠且可溯源可重建?一直是系統(tǒng)架構師在思考和追尋的。
解決方案:
- 將事件(Event)作為主數(shù)據(jù)源(Single source of truth),在上下文內則可以直接使用事件溯源(Event Sourcing)獲取領域對象的最新數(shù)據(jù)快照,對外則可以直接使用類似于Kafka的工具通過事件的傳遞和廣播進行不同上下文間的同樣基于事件溯源(Event Sourcing)的數(shù)據(jù)同步和轉換(ETL)。
解讀:
可能很多同學看到上邊的問題描述和解決方案后,還沒看到這就兒就已經走了……
這其實也可以理解,太多的詞兒讓人聽了不知所云,一頭霧水。什么Event、Sourcing、Source of Truth、Snapshot,感覺這些詞創(chuàng)造的時候可能就是為了架構師彰顯身份用的……
其實吧,很簡單,我們做個比喻大家就都清楚了,就拿大家熟悉的Git舉例子,Git就是一個就是基于事件(Commit)和事件溯源(Commit Chain)的好例子:
假設你有一份你的代碼(數(shù)據(jù)),我有一份我的代碼(數(shù)據(jù)),兩份代碼處理不同的事情。突然有一天我發(fā)現(xiàn)你寫代碼(數(shù)據(jù))其中有一塊我也能用,在通過一通“親切友好”的溝(暴)通(揍)后,我把你的最新代碼直接拷貝過來,放到了我的代碼庫里,并定時拷貝這塊最新的代碼過來,這就叫做同步(Synchronizing)。
后來我發(fā)現(xiàn)你的代碼和我的代碼還有一些不匹配,很多邏輯我并不用,只需要很少一部分,而且還得修改一下才能與我的代碼對接,這就叫做ETL(Extract-Transform-Load)。
作為一個有追求的程序員,我將這個拷貝轉換的過程(ETL)寫了個程序,每天早上7點工作前自動完成。但是這就引入了一個新的問題,這個程序有時候經常出問題(不要問我為什么……),導致我的代碼(數(shù)據(jù))和你的最新代碼(數(shù)據(jù))不一致,我需要知道我最新的代碼是哪一次同步的,是否完整,以及如何重新同步代碼到最新,這個過程就叫溯源(Sourcing)和重建(Rebuild)。
隨著我同步的代碼(數(shù)據(jù))越來越多,如何保證這些來自不同源的代碼(數(shù)據(jù))始終保持時間一致性,可溯源,可重建就慢慢成為一件比較難的事情,也就是我上面提到的這個Blip關注都問題。
在代碼拷貝這個場景里,Git給我們提供了另一種解決問題的思路。即我們不再保存我們的代碼在某一個時間點的完整代碼即代碼鏡像(Snapshot),而只是保存Commit信息,而一個Commit可以理解成就是一個事件(Event)。當我們需要最新代碼的時候,不是從代碼庫里直接復制出最新的完整的代碼版本,而是通過Commit鏈,從頭開始將一個一個Commmit Apply到一起,最終形成了代碼最新的樣子,這個過程就叫做事件溯源(Event Souring),這樣我們不僅記錄了某個時刻的數(shù)據(jù),而且記錄了整個歷史!
Event streaming as the source of truth,所描述的就是將這種基于Event存儲方案應用于我們的系統(tǒng)數(shù)據(jù)管理,即用存儲Event來代替存儲數(shù)據(jù)現(xiàn)狀快照,這樣我們就可以基于Event和Event Souring來處理數(shù)據(jù)的同時,還大大簡化和增強了不同上下文數(shù)據(jù)同步的能力。
這樣我們就具備了Git般的威力,可以在數(shù)據(jù)的歷史中穿梭,可以基于某個時間點做不同數(shù)據(jù)源的一致性同步,可以溯源,可以回滾,可以重建。而數(shù)據(jù)同步也會像Fork,F(xiàn)etch,Merge一樣簡單。
Blip來源:
::Techniques (ASSESS[ 2017.11 | 2018.05 ])::
Event streaming as the source of truth | Technology Radar | ThoughtWorks
相關Blip
- EventStore | Technology Radar | ThoughtWorks
- Event Sourcing | Technology Radar | ThoughtWorks
- Domain-scoped events | Technology Radar | ThoughtWorks
- Capture domain events explicitly | Technology Radar | ThoughtWorks
- Apache Kafka | Technology Radar | ThoughtWorks