先進(jìn)的網(wǎng)站建設(shè)百度推廣客服電話人工服務(wù)
目錄
1.分布式事務(wù)問(wèn)題
1.1本地事務(wù)
1.2分布式事務(wù)
2.理論基礎(chǔ)
2.1CAP定理
2.1.1一致性
2.1.2可用性
2.1.3分區(qū)容錯(cuò)
2.1.4矛盾
2.2BASE理論
2.3解決分布式事務(wù)的思路
1.分布式事務(wù)問(wèn)題
1.1本地事務(wù)
本地事務(wù),也就是傳統(tǒng)的單機(jī)事務(wù)。在傳統(tǒng)數(shù)據(jù)庫(kù)事務(wù)中,必須要滿足四個(gè)原則:
1.2分布式事務(wù)
分布式事務(wù),就是指不是在單個(gè)服務(wù)或單個(gè)數(shù)據(jù)庫(kù)架構(gòu)下,產(chǎn)生的事務(wù),例如:
-
跨數(shù)據(jù)源的分布式事務(wù)
-
跨服務(wù)的分布式事務(wù)
-
綜合情況
在數(shù)據(jù)庫(kù)水平拆分、服務(wù)垂直拆分之后,一個(gè)業(yè)務(wù)操作通常要跨多個(gè)數(shù)據(jù)庫(kù)、服務(wù)才能完成。例如電商行業(yè)中比較常見(jiàn)的下單付款案例,包括下面幾個(gè)行為:
-
創(chuàng)建新訂單
-
扣減商品庫(kù)存
-
從用戶賬戶余額扣除金額
完成上面的操作需要訪問(wèn)三個(gè)不同的微服務(wù)和三個(gè)不同的數(shù)據(jù)庫(kù)。
訂單的創(chuàng)建、庫(kù)存的扣減、賬戶扣款在每一個(gè)服務(wù)和數(shù)據(jù)庫(kù)內(nèi)是一個(gè)本地事務(wù),可以保證ACID原
則。
但是當(dāng)我們把三件事情看做一個(gè)"業(yè)務(wù)",要滿足保證“業(yè)務(wù)”的原子性,要么所有操作全部成功,要
么全部失敗,不允許出現(xiàn)部分成功部分失敗的現(xiàn)象,這就是分布式系統(tǒng)下的事務(wù)了。
此時(shí)ACID難以滿足,這是分布式事務(wù)要解決的問(wèn)題
1.3演示分布式事務(wù)問(wèn)題
我們通過(guò)一個(gè)案例來(lái)演示分布式事務(wù)的問(wèn)題:
1)創(chuàng)建數(shù)據(jù)庫(kù),名為seata_demo,然后導(dǎo)入課前資料提供的SQL文件:
2)導(dǎo)入課前資料提供的微服務(wù):
微服務(wù)結(jié)構(gòu)如下:
其中:
seata-demo:父工程,負(fù)責(zé)管理項(xiàng)目依賴
-
account-service:賬戶服務(wù),負(fù)責(zé)管理用戶的資金賬戶。提供扣減余額的接口
-
storage-service:庫(kù)存服務(wù),負(fù)責(zé)管理商品庫(kù)存。提供扣減庫(kù)存的接口
-
order-service:訂單服務(wù),負(fù)責(zé)管理訂單。創(chuàng)建訂單時(shí),需要調(diào)用account-service和storage-service
3)啟動(dòng)nacos、所有微服務(wù)
4)測(cè)試下單功能,發(fā)出Post請(qǐng)求:
請(qǐng)求如下:
curl --location --request POST 'http://localhost:8082/order?userId=user202103032042012&commodityCode=100202003032041&count=20&money=200'
如圖:
測(cè)試發(fā)現(xiàn),當(dāng)庫(kù)存不足時(shí),如果余額已經(jīng)扣減,并不會(huì)回滾,出現(xiàn)了分布式事務(wù)問(wèn)題。
2.理論基礎(chǔ)
解決分布式事務(wù)問(wèn)題,需要一些分布式系統(tǒng)的基礎(chǔ)知識(shí)作為理論指導(dǎo)。
2.1CAP定理
1998年,加州大學(xué)的計(jì)算機(jī)科學(xué)家 Eric Brewer 提出,分布式系統(tǒng)有三個(gè)指標(biāo)。
Consistency(一致性)
Availability(可用性)
Partition tolerance (分區(qū)容錯(cuò)性)
?
它們的第一個(gè)字母分別是 C、A、P。
Eric Brewer 說(shuō),這三個(gè)指標(biāo)不可能同時(shí)做到。這個(gè)結(jié)論就叫做 CAP 定理。
2.1.1一致性
Consistency(一致性):用戶訪問(wèn)分布式系統(tǒng)中的任意節(jié)點(diǎn),得到的數(shù)據(jù)必須一致。
比如現(xiàn)在包含兩個(gè)節(jié)點(diǎn),其中的初始數(shù)據(jù)是一致的:
當(dāng)我們修改其中一個(gè)節(jié)點(diǎn)的數(shù)據(jù)時(shí),兩者的數(shù)據(jù)產(chǎn)生了差異:
要想保住一致性,就必須實(shí)現(xiàn)node01 到 node02的數(shù)據(jù) 同步:
2.1.2可用性
Availability (可用性):用戶訪問(wèn)集群中的任意健康節(jié)點(diǎn),必須能得到響應(yīng),而不是超時(shí)或拒絕。
如圖,有三個(gè)節(jié)點(diǎn)的集群,訪問(wèn)任何一個(gè)都可以及時(shí)得到響應(yīng):
當(dāng)有部分節(jié)點(diǎn)因?yàn)榫W(wǎng)絡(luò)故障或其它原因無(wú)法訪問(wèn)時(shí),代表節(jié)點(diǎn)不可用:
2.1.3分區(qū)容錯(cuò)
Partition(分區(qū)):因?yàn)榫W(wǎng)絡(luò)故障或其它原因?qū)е路植际较到y(tǒng)中的部分節(jié)點(diǎn)與其它節(jié)點(diǎn)失去連接,
形成獨(dú)立分區(qū)。
Tolerance(容錯(cuò)):在集群出現(xiàn)分區(qū)時(shí),整個(gè)系統(tǒng)也要持續(xù)對(duì)外提供服務(wù)
2.1.4矛盾
在分布式系統(tǒng)中,系統(tǒng)間的網(wǎng)絡(luò)不能100%保證健康,一定會(huì)有故障的時(shí)候,而服務(wù)有必須對(duì)外保
證服務(wù)。因此Partition Tolerance不可避免。
當(dāng)節(jié)點(diǎn)接收到新的數(shù)據(jù)變更時(shí),就會(huì)出現(xiàn)問(wèn)題了:
如果此時(shí)要保證一致性,就必須等待網(wǎng)絡(luò)恢復(fù),完成數(shù)據(jù)同步后,整個(gè)集群才對(duì)外提供服務(wù),服務(wù)
處于阻塞狀態(tài),不可用。
如果此時(shí)要保證可用性,就不能等待網(wǎng)絡(luò)恢復(fù),那node01、node02與node03之間就會(huì)出現(xiàn)數(shù)據(jù)不
一致。
也就是說(shuō),在P一定會(huì)出現(xiàn)的情況下,A和C之間只能實(shí)現(xiàn)一個(gè)。
2.2BASE理論
BASE理論是對(duì)CAP的一種解決思路,包含三個(gè)思想:
-
Basically Available (基本可用):分布式系統(tǒng)在出現(xiàn)故障時(shí),允許損失部分可用性,即保證核心可用。
-
Soft State(軟狀態(tài)):在一定時(shí)間內(nèi),允許出現(xiàn)中間狀態(tài),比如臨時(shí)的不一致?tīng)顟B(tài)。
-
Eventually Consistent(最終一致性):雖然無(wú)法保證強(qiáng)一致性,但是在軟狀態(tài)結(jié)束后,最終達(dá)到數(shù)據(jù)一致。
2.3解決分布式事務(wù)的思路
分布式事務(wù)最大的問(wèn)題是各個(gè)子事務(wù)的一致性問(wèn)題,因此可以借鑒CAP定理和BASE理論,有兩種解決思路:
-
AP模式:各子事務(wù)分別執(zhí)行和提交,允許出現(xiàn)結(jié)果不一致,然后采用彌補(bǔ)措施恢復(fù)數(shù)據(jù)即可,實(shí)現(xiàn)最終一致。
-
CP模式:各個(gè)子事務(wù)執(zhí)行后互相等待,同時(shí)提交,同時(shí)回滾,達(dá)成強(qiáng)一致。但事務(wù)等待過(guò)程中,處于弱可用狀態(tài)。
但不管是哪一種模式,都需要在子系統(tǒng)事務(wù)之間互相通訊,協(xié)調(diào)事務(wù)狀態(tài),也就是需要一個(gè)事務(wù)協(xié)調(diào)者(TC):
這里的子系統(tǒng)事務(wù),稱為分支事務(wù);有關(guān)聯(lián)的各個(gè)分支事務(wù)在一起稱為全局事務(wù)。