NOSQL儲存的基於事件的事務實現
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認為兩段事務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。如下圖:
寫資料空間這邊主要儲存的是寫操作事件,比如ProfileUpdateEvent,如下圖:
非同步的傳送Job再將這些寫事件獲得,執行這些寫事件(事件觸發函式),向讀資料空間裡寫入更新的資料。如下圖:
非常重要的是,要保證讀領域的更新操作是冪等的(見蒯因與引用透明),還有事件必須充分有效地儲存到DB中,事件本身必須是自我獨立的。
[該貼被banq於2011-08-31 13:23修改過]
相關文章
- 關於事務的儲存過程儲存過程
- MySQL 中基於 XA 實現的分散式事務MySql分散式
- 基於RocketMQ實現分散式事務MQ分散式
- oracle事務中的儲存點Oracle
- 基於Seata探尋分散式事務的實現方案分散式
- lakeFS:實現類似於Git或事件溯源ES的物件儲存功能Git事件物件
- 200 行程式碼實現基於 Paxos 的 KV 儲存行程
- 實現基於zoom平臺上的oss額外儲存OOM
- 物件儲存服務的事件通知特性物件事件
- 基於EF Core儲存的國際化服務
- 基於SOA 的儲存管理
- Android,java,xml,xml讀取與儲存,基於AndroidXML解析與儲存的實現AndroidJavaXML
- 庫存-Mysql中的事務、鎖與儲存引擎MySql儲存引擎
- spring基於註解配置實現事務控制Spring
- Laravel基於reset機制實現分散式事務Laravel分散式
- NoSql-Redis事務SQLRedis
- 有關NOSQL事務SQL
- AES實現財務資料的加密解密儲存加密解密
- 實戰與原理:如何基於RocketMQ實現分散式事務?MQ分散式
- 基於 Vue.js 的支援本地化儲存記事本 SPAVue.js
- MySQL基於事務的ReplcaitonMySqlAI
- 基於微服務框架Micronaut和Eventuate Tram實現分散式事務的開源案例微服務框架分散式
- kunbernetes-基於NFS的儲存NFS
- MySQL索引、事務與儲存引擎MySql索引儲存引擎
- 如何基於MySQL及Redis搭建統一的KV儲存服務MySqlRedis
- 基於Ceph物件儲存構建實踐物件
- php基於dtm分散式事務管理器實現tcc模式分散式事務demoPHP分散式模式
- Spring Cloud Seata系列:基於AT模式實現分散式事務SpringCloud模式分散式
- MySQL innodb 事務的實現MySql
- 基於 XML Schema 的資料儲存方案XML
- 基於ROWCOUNT的分頁儲存過程儲存過程
- MySQL 儲存過程/遊標/事務MySql儲存過程
- 儲存過程中巢狀事務儲存過程巢狀
- 四、InnoDB儲存引擎如何利用鎖實現四種事務隔離級別儲存引擎
- 談談MySQL InnoDB儲存引擎事務的ACID特性MySql儲存引擎
- 基於可靠訊息方案的分散式事務(二):Java中的事務分散式Java
- 基於spring實現事件驅動Spring事件
- 將Oracle作為NoSQL文件儲存OracleSQL