從CRUD程式設計切換到事件溯源和區塊鏈程式設計

banq發表於2018-04-08
CRUD是增刪改查的簡稱,其中增刪改都屬於一種變動操作,而新增和刪改分別屬於兩種不同型別的變動,如果以記賬來類比,新增等同於多了一筆金額,而刪改等同於減少了一筆金額。

下面以文件的增刪改查從記賬角度看看如何理解。

文件                記賬

新增文件             +100

修改文件             -50

刪除文件             -50 
<p class="indent">


文件的當前狀態就是這些變動動作的累計,新增文件以後修改了這篇文件,最後又刪除了這個文件,那麼這個文件當前狀態是沒有了。而記賬如果假設期初餘額為零,存入了一筆100元,後來取出50,當再取出50時,這個賬戶當前餘額就是0了。

事件溯源EventSourcing與CRUD的區別就在於:
ES中記錄的是這三個變動,將這三個變動作為事件記錄儲存下來;而CRUD則是將這三個動作透過服務的增刪改查方法呼叫SQL的insert/update/delete語句實現。

CRUD實現方式:

文件                    記賬       SQL實現
 
新增文件             +100      insert/update

修改文件             -50       update

刪除文件             -50       delete/update
<p class="indent">


事件溯源EventSourcing實現方式:

文件                   記賬       ES實現
 
新增文件             +100      Event1

修改文件             -50        Event2

刪除文件             -50        Event3
<p class="indent">


ES實際記錄的是包含Event1 Event2 Event3的集合,當需要獲得當前狀態時,透過播放這些事件獲得,比如賬戶當前餘額是:100 -50 -50=0,文件當前狀態透過遍歷事件集合:apply(event1) --> apply(event2) --->apply(event3) 計算以後的結果。

區塊鏈實際是將ES的這些事件集合複製到每個機器上,同時將這些事件嚴格透過事件編號連結起來,事件之間就無法隨意插入其他事件,保證事件鏈在分散式環境中的完整。

區塊鏈就是把Event1 <--- Event2 <--- Event3事件透過編號串聯起來,每臺機器上不但有一個完整的事件集合,而且這些事件透過編號串聯起來如同一個鏈條,當有新的事件進來,首先找出事件鏈中最後的事件編號,然後靠算力算出新的事件編號:
Event1編號Hash <--- Event2編號Hash --->Event3編號Hash

區塊鏈其實是一種分散式的事件溯源ES。

總之,基於事件驅動的事件溯源ES是一種與傳統CRUD完全不同的程式設計正規化,更是一種新的區塊鏈程式設計正規化。透過這種事件驅動程式設計方式不但可以解決傳統分散式事務的難題,而且可以提升了系統的擴充套件性和彈性。傳統的CRUD方式雖然簡單易用,但是非常依賴關聯式資料庫技術,相信隨著區塊鏈技術的發展,傳統CRUD程式設計將慢慢會淘汰,變成培訓課堂上的練習入門技術。

相關文章