NOSQL儲存的基於事件的事務實現

banq發表於2011-08-31
NOSQL儲存的基於事件的事務實現

NoSQL認為兩段事務2PC容易導致每個參與者鎖定一段時間,不能實現資料分割槽(CAP定理),但是關聯式資料庫能夠實現我們需要的原子級別事務更新。這在許多應用中是必須的。

那麼在這種需要高一致性原子事務情況下一定要使用關聯式資料庫呢?甚至有人提出關聯式資料庫為主,NoSQL為輔助的所謂通用方案。這篇文章就提出了基於事件的NOSQL事務解決方案。

NOSQL中忽視原子事務的一個自然解決方案是:如果在分割槽更新失敗情況下,就讓資料不一致唄,如果將吞吐量因素高於一切,甚至高於資料本身的話,這是一種可接受方案。

如果非得需要事務情況下,怎麼辦呢,文章認為其實在4年前的Adam Heroku一篇部落格已經給出答案:http://adam.heroku.com/past/2007/12/17/a_world_without_sql/

銀行賬戶之間轉帳的老式做法是使用資料庫事務,這種做法比較剛性(公牛),正確做法是將轉帳事件儲存起來(banq注:EDA事件驅動架構,把事件當資料,Hold住事件本身,而不是事件的結果資料),如果你是一個面向函式正規化的思維者,這本身沒有什麼奇怪的。

對於NoSQL,解決方式是使用兩種不同的資料空間,一個用來寫資料,一個用來讀書節,還有一個Job非同步地從第一個資料空間拉資料,將其傳送複製到第二個空間,兩個空間有不同的資料模型,讀寫分離架構CQRS。如下圖:

NOSQL儲存的基於事件的事務實現

寫資料空間這邊主要儲存的是寫操作事件,比如ProfileUpdateEvent,如下圖:

NOSQL儲存的基於事件的事務實現

非同步的傳送Job再將這些寫事件獲得,執行這些寫事件(事件觸發函式),向讀資料空間裡寫入更新的資料。如下圖:

NOSQL儲存的基於事件的事務實現


非常重要的是,要保證讀領域的更新操作是冪等的(見蒯因與引用透明),還有事件必須充分有效地儲存到DB中,事件本身必須是自我獨立的。

資料管理的未來: “Disk-less” 風格資料庫?

[該貼被banq於2011-08-31 13:23修改過]

相關文章