githubgit
在本地事務這篇文章裏咱們講到了數據庫事務必須保證ACID,在2PC這篇文章裏,咱們探討了跨數據庫事務是如何保證ACID的。github
當數據量愈來愈大的時候,咱們會對將大數據庫拆分紅若干小庫,隨着數據庫數量愈來愈多,2PC(及XA)就顯得有些捉襟見肘了:數據庫
CAP理論是Eric Brewer教授針對分佈式數據庫所提出的一套理論,他認爲在實現分佈式數據庫,須要考慮3個需求:segmentfault
CAP理論指出,當每一個節點都工做正常的時候,C、A、P是能夠都知足的,當出現節點故障時,咱們只能3選2。併發
若是咱們不想由於數據庫的某個節點出現故障就讓數據庫中止服務,那麼咱們一定選擇P,那麼咱們就只能在C和A之間作選擇。若是選擇C:後續的讀都將失敗。若是選擇A:會讀到不一致的結果。分佈式
Basically Available, Soft state, Eventually consistent,簡稱BASE。高併發
BASE和ACID相反,ACID是悲觀的,它要求全部操做都必須保證一致性,而BASE是樂觀的,它接受數據庫的一致性在不斷變化當中。同時,BASE對於CAP中的C作出了必定的妥協——接受臨時的不一致,採用最終一致性。最終一致性,聽上去怪怪的,一些開發人員以爲這是個壞東西。不過咱們真的要時時刻刻保證一致性嗎?BASE認爲咱們能夠作一些妥協,所以若是咱們按照BASE設計系統的話就可以保證:性能
舉個例子,如今咱們有3條insert要執行(至因而否是3個不一樣的表、數據庫不重要),那麼只要保證下面幾點就可以知足BASE:大數據
正確地使用BASE模式也不是那麼容易,好比消費業務,咱們要保證「檢查餘額」和「扣款、記錄消費日誌」這兩組動做不會產生交叉,不然就會由於高併發場景而發生透支,在這個例子裏咱們能夠對「扣款、記錄消費日誌」作最終一致性,可是如何保證下達「扣款、記錄消費日誌」這兩個指令確定不會產生透支的狀況則不是BASE解決的問題了。設計
因此總結一下BASE的特色就是:
關於BASE能夠詳見這篇文章BASE: An Acid Alternative。