acid和cap的雜談

1.a:表示原子性,事務中若是有多個修改操做,會把這些操做記錄日誌,若是失敗則根據日誌回滾;html

2.c:一致性,表示數據要正確,例如A往B轉了一百塊,A帳戶要少一百塊,B帳戶要多一百塊;例如扣完了庫存,要新增一個流水和庫存剩餘要更改;redis

       也就是數據要始終保證是正確的。而CAP裏面的C,也是一致性,從表面上看是各個節點的數據要一致,可是本質上還要保證數據的正確性,緩存

       節點的數據不一致了,A節點顯示用戶帳戶有10塊錢,B節點顯示用戶有5塊錢,這顯然是也是數據不正確,只是這種不正確多是短暫的,分佈式

        等緩存過了,等數據同步過來了,等了幾秒鐘後纔會正確。性能

3.i:隔離性,其實有原子性,數據串行執行理論上不會產生錯誤的數據了,可是若是並行執行機會使得事務相互影響,須要將事務所有或者局部串行化,設計

      保證數據不會出錯。日誌

 

優惠券平臺,redis和DB不一樣步,這是由於設計系統追求的是可用性,在redis掛掉的時候,接口仍然能夠運行,犧牲了一致性,後期經過消息加上JOB的補償htm

    達到了最終的一致性。而優惠券平臺事務之間的隔離,也就是直接在事務上加上全局鎖(不是局部串行),使得同一個交易變成串行執行,防止數據產生blog

    覆蓋更新,也是爲了數據的一致性。接口

參考:  https://www.zhihu.com/question/30272728

cap中:

1.c:表示節點數據一致性,在分佈市中一致性表示每一個節點都須要有一致的數據返回;

2.a:可用性,若是追求強一致性,可用性就會犧牲,強一致性意味着數據要同步修改,同時沒有被修改的節點處於不可訪問的狀態,很顯然可用性就低了

3.p:分區容忍性,當原本放在一處的數據如今容忍他例如通過sharding放在不一樣的地方(擴展),就產生了分區,也就是容忍了分區,

    分區在傳統acid裏面意味着,個人原子性比較難作,例如須要兩段式提交,容易產生acid裏面的不一致,也就是保證cap裏面的一致性就難了,

總結:數據不一致,由於節點之間數據沒有及時同步,也由於分區後數據分散在多個點,容易不一致,

        若是數據只在一個節點能夠訪問,就有單點問題,也就可用性差了了

   若是不能容忍分區,意味着系統不能把數據分散存放,他的擴展能力不行,性能就上不去,

         若是容忍了,容易不一致,這裏不一致表示acid裏面的不一致,數據落在不一樣的節點上,作事務就設計分佈式事務了

        若是有單點,容易不可用,若是j

   點多了,容易不一致。

參考: http://www.cnblogs.com/hxsyl/p/4381980.html

相關文章
相關標籤/搜索