最近在使用springboot搭建微服務(wù)架構(gòu),遇到數(shù)據(jù)一致性問題,今天就對(duì)它進(jìn)行一個(gè)小結(jié)。
數(shù)據(jù)一致性是分布式系統(tǒng)中的一個(gè)關(guān)鍵需要解決的問題,雖然分布式系統(tǒng)帶來了擴(kuò)展的彈性,但是帶來了數(shù)據(jù)不一致性的風(fēng)險(xiǎn),尤其是在不同網(wǎng)絡(luò)隔離,實(shí)現(xiàn)細(xì)節(jié)透明的業(yè)務(wù)子系統(tǒng)之間的數(shù)據(jù)不一致風(fēng)險(xiǎn)會(huì)成倍遞增。如今衡量一個(gè)企業(yè)的軟件架構(gòu)是不是有潛力的,那必須得看架構(gòu)是不是分布式的,也就是說既然分布式架構(gòu)如此流行,那么數(shù)據(jù)一致性就提到了一個(gè)更高的標(biāo)準(zhǔn)了。
說道分布式架構(gòu)的數(shù)據(jù)一致性困難,我們需要充CAP原理講起。
CAP原理,它就好比分布式領(lǐng)域的牛頓定律。C-Consistent一致性,指前后數(shù)據(jù)不一致,userA訪問數(shù)據(jù)value1但user2訪問同樣數(shù)據(jù)卻是value2,數(shù)據(jù)就不一致了。A-Availability可用性,指用戶請(qǐng)求就要給出回應(yīng)。P-Partition
tolerance分區(qū)容錯(cuò)性,指大多數(shù)分布式系統(tǒng)都分布在多個(gè)子系統(tǒng),區(qū)間通信可能失敗,比如兩臺(tái)服務(wù)器發(fā)生了網(wǎng)絡(luò)分區(qū),拿著兩臺(tái)服務(wù)器無法通信。這三個(gè)變量相互制約,對(duì)于系統(tǒng)設(shè)計(jì)的場景分別采取不同的偏重策略。
舉個(gè)例子吧,分布式系統(tǒng)中系統(tǒng)S1和S2,當(dāng)S1系統(tǒng)發(fā)生寫操作,要保證S2的一致性,只有鎖定S2的讀操作和寫操作,鎖定期間S2是沒有可用性的。這三個(gè)變量相互制約為了提高C就會(huì)導(dǎo)致A、P降低或不滿足,反之亦然。
當(dāng)然CAP理論已經(jīng)指明系統(tǒng)要實(shí)現(xiàn)完全的一致性和可用性是不可能的,當(dāng)然在CAP理論基礎(chǔ)上又發(fā)展了BASE模型和ACID模型等。這兩個(gè)模型各有優(yōu)勢。
但是在目前比較成熟集中保證數(shù)據(jù)一致性方法,包括了強(qiáng)一致性、弱一致性和最終一致性。
強(qiáng)一致性,是當(dāng)一個(gè)系統(tǒng)完成了數(shù)據(jù)更新操作之后,后續(xù)關(guān)聯(lián)的子系統(tǒng)也一并完成更新操作。這種決策用戶最友好,用戶寫了什么,就會(huì)讀到什么。但是根據(jù)CAP理論,這種實(shí)現(xiàn)犧牲了可用性。成型的技術(shù)方案比如springboot的jat+atomikos方案,他通過兩階段提交(XA協(xié)議規(guī)定)完成數(shù)據(jù)更新,客戶端必須保證按照XA協(xié)議完成編寫,并且數(shù)據(jù)庫必須是支持XA協(xié)議的數(shù)據(jù)庫,通常客戶端會(huì)將事務(wù)處理和業(yè)務(wù)處理是現(xiàn)在一起。這就帶了另一個(gè)不足就是帶來了事務(wù)處理和業(yè)務(wù)耦合性強(qiáng)增加了復(fù)雜度。
弱一致性,是系統(tǒng)不保證后續(xù)進(jìn)程或者線程會(huì)訪問最新的值。成型的技術(shù)方案比如利用消息隊(duì)列完成數(shù)據(jù)一致性,S1系統(tǒng)完成數(shù)據(jù)更新,將更新操作發(fā)送到消息隊(duì)列,S2系統(tǒng)從消息隊(duì)列中獲取事件完成更新操作。這個(gè)方案在大廠被廣泛的使用,也是比較流行的一種方式。
最終一致性,它是弱一致性的特定形式。如,DNS是一個(gè)典型的最終一致性系統(tǒng)。
今天對(duì)分布式系統(tǒng)數(shù)據(jù)一致性做了小結(jié),架構(gòu)師們?cè)谠O(shè)計(jì)的時(shí)候做到有的放矢,如何實(shí)現(xiàn)在成本利潤的最大化。