深入淺出:分布式、CAP 和 BASE 理論
1.什么是事務(wù)
但是在這之前要先知道什么是事務(wù)。
什么是事務(wù)?
舉個(gè)生活中的例子:你去小賣鋪買東西,“一手交錢,一手交貨”就是一個(gè)事務(wù)的例子,交錢和交貨必須全部成功,事務(wù)才算成功,任一個(gè)活動(dòng)失敗,事務(wù)將撤銷所有已成功的活動(dòng)。 明白上述例子,再來看事務(wù)的定義:
事務(wù)可以看做是一次大的活動(dòng),它由不同的小活動(dòng)組成,這些活動(dòng)要么全部成功,要么全部失敗
2.本地事務(wù)
在計(jì)算機(jī)系統(tǒng)中,更多的是通過關(guān)系型數(shù)據(jù)庫來控制事務(wù),這是利用數(shù)據(jù)庫本身的事務(wù)特性來實(shí)現(xiàn)的,因此叫數(shù)據(jù)庫事務(wù),由于應(yīng)用主要靠關(guān)系數(shù)據(jù)庫來控制事務(wù),而數(shù)據(jù)庫通常和應(yīng)用在同一個(gè)服務(wù)器,所以基于關(guān)系型數(shù)據(jù)庫的事務(wù)又被稱為本地事務(wù)
2.1. 數(shù)據(jù)庫事務(wù)特性
- A(Atomic):原子性,構(gòu)成事務(wù)的所有操作,要么都執(zhí)行完成,要么全部不執(zhí)行,不可能出現(xiàn)部分成功部分失敗的情況
- C(Consistency):一致性,在事務(wù)執(zhí)行前后,數(shù)據(jù)庫的一致性約束沒有被破壞。比如:張三向李四轉(zhuǎn)100元,轉(zhuǎn)賬前和轉(zhuǎn)賬后的數(shù)據(jù)是正確狀態(tài)這叫一致性,如果出現(xiàn)張三轉(zhuǎn)出100元,李四賬戶沒有增加100元這就出現(xiàn)了數(shù)據(jù)錯(cuò)誤,就沒有達(dá)到一致性
- I(Isolation):隔離性,數(shù)據(jù)庫中的事務(wù)一般都是并發(fā)的,隔離性是指并發(fā)的兩個(gè)事務(wù)的執(zhí)行互不干擾,一個(gè)事務(wù)不能看到其他事務(wù)運(yùn)行過程的中間狀態(tài)。通過配置事務(wù)隔離級(jí)別可以避臟讀、重復(fù)讀等問題
- D(Durability):持久性,事務(wù)完成之后,該事務(wù)對(duì)數(shù)據(jù)的更改會(huì)被持久化到數(shù)據(jù)庫,且不會(huì)被回滾
數(shù)據(jù)庫事務(wù)在實(shí)現(xiàn)時(shí)會(huì)將一次事務(wù)涉及的所有操作全部納入到一個(gè)不可分割的執(zhí)行單元,該執(zhí)行單元中的所有操作要么都成功,要么都失敗,只要其中任一操作執(zhí)行失敗,都將導(dǎo)致整個(gè)事務(wù)的回滾。
3.分布式事務(wù)
軟件系統(tǒng)由原來的單體應(yīng)用轉(zhuǎn)變?yōu)榉植际綉?yīng)用,下圖描述了單體應(yīng)用向微服務(wù)的演變
分布式系統(tǒng)把一個(gè)應(yīng)用系統(tǒng)拆分為可獨(dú)立部署的多個(gè)服務(wù),因此需要服務(wù)與服務(wù)之間遠(yuǎn)程協(xié)作才能完成事務(wù)操作,這種分布式系統(tǒng)環(huán)境下由不同的服務(wù)之間通過網(wǎng)絡(luò)遠(yuǎn)程協(xié)作完成事務(wù)稱之為分布式事務(wù),例如用戶注冊(cè)送積分事務(wù)、創(chuàng)建訂單減庫存事務(wù),銀行轉(zhuǎn)賬事務(wù)等都是分布式事務(wù)
本地事務(wù)依賴數(shù)據(jù)庫本身提供的事務(wù)特性來實(shí)現(xiàn),因此以下邏輯可以控制本地事務(wù):
begin transaction;
//1.本地?cái)?shù)據(jù)庫操作:張三減少金額
//2.本地?cái)?shù)據(jù)庫操作:李四增加金額
commit transation;
分布式環(huán)境,事務(wù)變成下邊這樣:
begin transaction;
//1.本地?cái)?shù)據(jù)庫操作:張三減少金額
//2.遠(yuǎn)程調(diào)用:讓李四增加金額
commit transation;
可以想象,當(dāng)遠(yuǎn)程調(diào)用讓李四增加金額成功了,由于網(wǎng)絡(luò)問題遠(yuǎn)程調(diào)用并沒有返回,此時(shí)本地事務(wù)提交失敗就回滾了張三減少金額的操作,此時(shí)張三和李四的數(shù)據(jù)就不一致了。 因此在分布式架構(gòu)的基礎(chǔ)上,傳統(tǒng)數(shù)據(jù)庫事務(wù)就無法使用了,張三和李四的賬戶不在一個(gè)數(shù)據(jù)庫中甚至不在一個(gè)應(yīng)用系統(tǒng)里,實(shí)現(xiàn)轉(zhuǎn)賬事務(wù)需要通過遠(yuǎn)程調(diào)用,由于網(wǎng)絡(luò)問題就會(huì)導(dǎo)致分布式事務(wù)問題。
4.CAP定理
CAP是是分布式系統(tǒng)設(shè)計(jì)中非常重要的一個(gè)原則,它是指 **Consistency(一致性)、Availability(可用性)、Partition tolerance(分區(qū)容錯(cuò)性)**三個(gè)基本原則。
4.1. Consistency(一致性)
一致性:是當(dāng)數(shù)據(jù)分布在多個(gè)節(jié)點(diǎn)上,從任意結(jié)點(diǎn)讀取到的數(shù)據(jù)都是最新的狀態(tài),從而確保數(shù)據(jù)準(zhǔn)確性
在分布式系統(tǒng)中,廣泛的一致性分為三種,分別是強(qiáng)一致性、弱一致性和最終一致性。
4.1.1. 強(qiáng)一致性
強(qiáng)一致性要求用戶在分布式系統(tǒng)中訪問數(shù)據(jù)時(shí),不管是哪個(gè)節(jié)點(diǎn)的響應(yīng),數(shù)據(jù)都應(yīng)該完全一致
比如轉(zhuǎn)賬系統(tǒng)張三給李四轉(zhuǎn)賬1000塊,那么張三賬戶減少1000塊,同時(shí)李四賬戶響應(yīng)減少100塊,即要么賬戶 A 和賬戶 B 的余額都更新成功,要么都不更新。這樣可以避免出現(xiàn)轉(zhuǎn)賬金額在系統(tǒng)中“消失”的情況,從而保證了數(shù)據(jù)的一致性,確保了銀行業(yè)務(wù)的正常運(yùn)行。
4.1.2. 弱一致性
弱一致性是指在分布式系統(tǒng)中,允許在一定條件下出現(xiàn)數(shù)據(jù)不一致的情況,但最終數(shù)據(jù)會(huì)趨于一致,不保證實(shí)時(shí)性和強(qiáng)制性。這種一致性級(jí)別通常用于需要高可用性和性能的場(chǎng)景,允許在一段時(shí)間內(nèi)出現(xiàn)數(shù)據(jù)不一致,但最終數(shù)據(jù)會(huì)在系統(tǒng)內(nèi)部達(dá)到一致狀態(tài)
比如公眾號(hào)在發(fā)布消息后,不同的粉絲可能在不同的時(shí)間內(nèi)收到該消息。這是因?yàn)橄⑼扑涂赡軙?huì)經(jīng)過多個(gè)節(jié)點(diǎn)和服務(wù),不同節(jié)點(diǎn)的處理速度和網(wǎng)絡(luò)延遲會(huì)導(dǎo)致消息的推送時(shí)延不一致。
4.1.3. 最終一致性
最終一致性是指分布式系統(tǒng)中的數(shù)據(jù)副本在一段時(shí)間內(nèi)可以存在不一致的情況,但最終會(huì)趨于一致狀態(tài)。這種一致性級(jí)別通常用于分布式系統(tǒng)中的數(shù)據(jù)復(fù)制和同步場(chǎng)景,系統(tǒng)會(huì)在一定的時(shí)間范圍內(nèi)保證數(shù)據(jù)最終達(dá)到一致狀態(tài),但不保證實(shí)時(shí)性和強(qiáng)制性。
比如當(dāng)你的朋友對(duì)帖子進(jìn)行點(diǎn)贊后,該信息需要被同步到所有觀看該帖子的用戶界面上。這個(gè)同步過程可能也是異步的,并且可能會(huì)受到網(wǎng)絡(luò)延遲等因素的影響,導(dǎo)致一段時(shí)間內(nèi)點(diǎn)贊信息在不同用戶界面上不一致,盡管在點(diǎn)贊過程中可能會(huì)出現(xiàn)一定的時(shí)間窗口內(nèi)數(shù)據(jù)不一致的情況,但社交媒體平臺(tái)會(huì)通過一定的機(jī)制和策略來保證最終所有帖子的點(diǎn)贊數(shù)量都達(dá)到一致狀態(tài)。這種最終一致性的特性使得社交媒體平臺(tái)能夠在分布式環(huán)境下提供可靠的服務(wù),保證用戶的交互體驗(yàn)
注意:一般的業(yè)務(wù)系統(tǒng)基于性價(jià)比的考量,絕大多數(shù)都是采用最終一致性作為分布式系統(tǒng)的設(shè)計(jì)思想。而 CAP 理論里的一致性,則要求是強(qiáng)一致性。正如官方文檔中描述的那樣:All nodes see the same data at the same time,所有節(jié)點(diǎn)在同一時(shí)間內(nèi)數(shù)據(jù)完全一致
4.2.Availability(可用性)
可用性是指任何事務(wù)操作都可以得到響應(yīng)結(jié)果,且不會(huì)出現(xiàn)響應(yīng)超時(shí)或響應(yīng)錯(cuò)誤。
可用性確保了系統(tǒng)的穩(wěn)定性和可靠性,它描述的是系統(tǒng)能夠很好地為用戶服務(wù),不會(huì)出現(xiàn)用戶操作失敗或者訪問超時(shí)的情況,影響用戶體驗(yàn)。
4.3.Partition tolerance(分區(qū)容錯(cuò)性)
通常分布式系統(tǒng)的各各結(jié)點(diǎn)部署在不同的子網(wǎng),這就是網(wǎng)絡(luò)分區(qū),不可避免的會(huì)出現(xiàn)由于網(wǎng)絡(luò)問題而導(dǎo)致結(jié)點(diǎn)之間通信失敗,此時(shí)仍可對(duì)外提供服務(wù),這叫分區(qū)容忍性
5.CAP特點(diǎn)
思考:CAP可以同時(shí)成立嗎
不可以,在CAP理論實(shí)際告訴我們,在分布式系統(tǒng)中,我們最多可以同時(shí)滿足兩個(gè)特性,無法同時(shí)滿足三個(gè)
在分布式系統(tǒng)中,系統(tǒng)間的網(wǎng)絡(luò)不能100%保證健康,一定會(huì)有故障的時(shí)候,而服務(wù)又必須對(duì)外保證服務(wù)。因此Partition Tolerance(分區(qū)容錯(cuò)性)不可避免。當(dāng)節(jié)點(diǎn)接收到新的數(shù)據(jù)變更時(shí),就會(huì)出現(xiàn)問題了:
- 如果此時(shí)要保證**Consistency(一致性)**,就必須等待網(wǎng)絡(luò)恢復(fù),完成數(shù)據(jù)同步后,整個(gè)集群才對(duì)外提供服務(wù),服務(wù)處于阻塞狀態(tài),不可用。
- 如果此時(shí)要保證**Availability(可用性)**,就不能等待網(wǎng)絡(luò)恢復(fù),那服務(wù)之間就會(huì)出現(xiàn)數(shù)據(jù)不一致。
也就是說,在P一定會(huì)出現(xiàn)的情況下,A和C之間只能實(shí)現(xiàn)一個(gè)。
CAP是一個(gè)已經(jīng)被證實(shí)的理論:一個(gè)分布式系統(tǒng)最多只能同時(shí)滿足一致性(Consistency)、可用性(Availability)和分區(qū)容忍性(Partition tolerance)這三項(xiàng)中的兩項(xiàng)。它可以作為我們進(jìn)行架構(gòu)設(shè)計(jì)、技術(shù)選型的考量標(biāo)準(zhǔn)。對(duì)于多數(shù)大型互聯(lián)網(wǎng)應(yīng)用的場(chǎng)景,結(jié)點(diǎn)眾多、部署分散,而且現(xiàn)在的集群規(guī)模越來越大,所以節(jié)點(diǎn)故障、網(wǎng)絡(luò)故障是常態(tài),而且要保證服務(wù)可用性達(dá)到N個(gè)9(99.99..%),并要達(dá)到良好的響應(yīng)性能來提高用戶體驗(yàn),因此一般都會(huì)做出如下選擇:保證P和A,舍棄C強(qiáng)一致,保證最終一致性
6.Base理論
BASE理論是對(duì)分布式系統(tǒng)中的一致性和可用性進(jìn)行權(quán)衡的理論,它是對(duì)CAP理論的一種延伸和補(bǔ)充,包含三個(gè)思想:
- Basically Available (基本可用):分布式系統(tǒng)在出現(xiàn)故障時(shí),允許損失部分可用性,即保證核心可用。
- Soft State(軟狀態(tài)):在一定時(shí)間內(nèi),允許出現(xiàn)中間狀態(tài),比如臨時(shí)的不一致狀態(tài)。
- Eventually Consistent(最終一致性):雖然無法保證強(qiáng)一致性,但是在軟狀態(tài)結(jié)束后,最終達(dá)到數(shù)據(jù)一致。
BASE理論相對(duì)于傳統(tǒng)的ACID(原子性、一致性、隔離性和持久性)理論,主要強(qiáng)調(diào)分布式系統(tǒng)的可用性和性能。在某些特定的場(chǎng)景下,犧牲臨時(shí)的一致性來換取系統(tǒng)的高可用性和性能是可接受的。例如,大規(guī)模的互聯(lián)網(wǎng)應(yīng)用中,BASE理論常常應(yīng)用于分布式緩存、消息隊(duì)列、分布式文件系統(tǒng)等系統(tǒng)設(shè)計(jì)中。
注意:BASE并不是一個(gè)具體的算法或協(xié)議,而是一種設(shè)計(jì)思想和原則,可以理解為BASE理論是對(duì)CAP的一種解決思路。