CAP原理
定義
在一個(gè)分布式系統(tǒng)(指系統(tǒng)中的節(jié)點(diǎn)互相連接并共享數(shù)據(jù))中,當(dāng)涉及讀寫操作時(shí),只能保證一致性 (Consistency)、可用性 (Availability)、分區(qū)容錯(cuò)性 (Partition Tolerance)三者中的兩個(gè),另外一個(gè)必須被犧牲。
一致性:CAP中的C和ACID 中的C不是一個(gè)含義,ACID 中的C是指數(shù)據(jù)庫(kù)中的數(shù)據(jù)滿足一定的約束條件。而CAP中的C是指線性一致性,即:客戶端向系統(tǒng)寫入什么,那么讀出來的也會(huì)是什么。也就是要保證客戶端讀取到的數(shù)據(jù)一定是上次寫入的最新數(shù)據(jù)。
可用性:指系統(tǒng)中的部分節(jié)點(diǎn)出現(xiàn)故障后,系統(tǒng)能否還能對(duì)外提供完全可用的服務(wù);
分區(qū)容錯(cuò)性:指是否允許系統(tǒng)中的節(jié)點(diǎn)之間無法通信,也就是無法互相連接;
適用場(chǎng)景
那么什么樣的分布式系統(tǒng)是節(jié)點(diǎn)之間互聯(lián)并共享數(shù)據(jù)呢?
典型的場(chǎng)景就是數(shù)據(jù)庫(kù)的主從集群,一個(gè)數(shù)據(jù)庫(kù)集群有一個(gè)主,多個(gè)從,主從之間會(huì)進(jìn)行數(shù)據(jù)復(fù)制。所以適用于CAP原理。
那么如果我現(xiàn)在是一個(gè)Redis的集群,集群中每臺(tái)機(jī)器存儲(chǔ)不同的數(shù)據(jù),集群中每臺(tái)機(jī)器不需要復(fù)制和傳遞數(shù)據(jù),那么就不屬于CAP原理的討論范圍。同理,如果是A,B兩個(gè)不同的業(yè)務(wù)系統(tǒng),比如招行賬號(hào)A給工行賬號(hào)B轉(zhuǎn)賬100元,由于招行和工行是兩個(gè)不同的業(yè)務(wù)系統(tǒng),業(yè)務(wù)上隔離,且他們之間也沒有共享的數(shù)據(jù),從而也不屬于CAP原理的討論范圍。
場(chǎng)景方案選擇
傳統(tǒng)數(shù)據(jù)庫(kù)主從集群:如果當(dāng)前是一個(gè)現(xiàn)在是一個(gè)主從復(fù)制的數(shù)據(jù)庫(kù)集群,同一條數(shù)據(jù)會(huì)在主從數(shù)據(jù)庫(kù)上都存儲(chǔ),那么當(dāng)存在主從數(shù)據(jù)庫(kù)之間網(wǎng)絡(luò)斷開時(shí),我們確實(shí)只能要么選擇A放棄C,要么選擇C放棄A。選擇A放棄C,就是客戶端讀取到的可能不是最新的數(shù)據(jù),但是系統(tǒng)持續(xù)可用;選擇C放棄A,就是讓系統(tǒng)服務(wù)不可用,客戶端自然就不會(huì)認(rèn)為數(shù)據(jù)不一致了。
分布式數(shù)據(jù)庫(kù),如阿里的OceanBase,這種數(shù)據(jù)庫(kù)也是一個(gè)主從的集群,但是主從節(jié)點(diǎn)往往使用Paxos/Raft等副本一致性協(xié)議,做到整個(gè)數(shù)據(jù)庫(kù)系統(tǒng),在部分節(jié)點(diǎn)發(fā)生故障時(shí),也能在很短的時(shí)間內(nèi)自動(dòng)重新選主,選出一個(gè)新的主從集群的數(shù)據(jù)庫(kù)系統(tǒng)。在重新選主的過程中,系統(tǒng)不可用,相當(dāng)于放棄了A,而一旦選出新的主之后,系統(tǒng)又繼續(xù)可用,且數(shù)據(jù)對(duì)外是線性一致的。相比傳統(tǒng)的數(shù)據(jù)庫(kù)主從集群,分布式數(shù)據(jù)庫(kù)由于可以在遇到網(wǎng)絡(luò)分區(qū)導(dǎo)致數(shù)據(jù)庫(kù)主從節(jié)點(diǎn)之間無法互聯(lián)時(shí),可以快速選出新的主,然后快速恢復(fù),所以架構(gòu)設(shè)計(jì)上和用戶體驗(yàn)上,要好很多。但是系統(tǒng)設(shè)計(jì)的復(fù)雜度也非常高。
分布式事務(wù)
通過上面的分析,我們知道CAP中的數(shù)據(jù)一致性,本質(zhì)上是為了維護(hù)同一個(gè)數(shù)據(jù)的不同副本之間的一致性。而更多的時(shí)候,我們要解決的是不同業(yè)務(wù)系統(tǒng)之間的數(shù)據(jù)一致性,即數(shù)據(jù)之間總是應(yīng)該滿足規(guī)定的業(yè)務(wù)規(guī)則。典型的場(chǎng)景比如有跨行轉(zhuǎn)賬、訂單和減庫(kù)存。這種場(chǎng)景,由于沒有數(shù)據(jù)共享的特征,所以不適用于CAP。比如A銀行的賬戶給B銀行的賬戶轉(zhuǎn)賬100元,那么轉(zhuǎn)賬前后,兩個(gè)賬戶的錢加起來應(yīng)該不變。也就是A扣款了,B就必須加款。那么這種場(chǎng)景如何解決呢?一般的做法是采用分布式事務(wù),常見的分布式事務(wù)的解決方案有:2PC\3PC、TCC、基于分布式MQ+本地消息、分布式MQ事務(wù)消息、Sagas。
使用優(yōu)惠口令「dotnet123」
????到手僅¥89,限前200人
總結(jié)
- 上一篇: .net core 实现基于 JSON
- 下一篇: 服务器应用服务为何卡顿?原来是内存耗尽惹