一次課程發(fā)布操作需要向數(shù)據(jù)庫、redis、elasticsearch、MinIO寫四份數(shù)據(jù),這里存在分布式事務(wù)問題。
創(chuàng)新互聯(lián)公司長(zhǎng)期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為漳浦企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都做網(wǎng)站,漳浦網(wǎng)站改版等技術(shù)服務(wù)。擁有十載豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開發(fā)。什么是分布式事務(wù)?
首先理解什么是本地事務(wù)?
平常我們?cè)诔绦蛑型ㄟ^spring去控制事務(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ù)。
本地事務(wù)具有ACID四大特性,數(shù)據(jù)庫事務(wù)在實(shí)現(xiàn)時(shí)會(huì)將一次事務(wù)涉及的所有操作全部納入到一個(gè)不可分割的執(zhí)行單元,該執(zhí)行單元中的所有操作 要么都成功,要么都失敗,只要其中任一操作執(zhí)行失敗,都將導(dǎo)致整個(gè)事務(wù)的回滾。
理解了本地事務(wù),什么是分1事務(wù)?
現(xiàn)在的需求是課程發(fā)布操作后將數(shù)據(jù)寫入數(shù)據(jù)庫、redis、elasticsearch、MinIO四個(gè)地方,這四個(gè)地方已經(jīng)不限制在一個(gè)數(shù)據(jù)庫內(nèi),是由四個(gè)分散的服務(wù)去提供,與這四個(gè)服務(wù)去通信需要網(wǎng)絡(luò)通信,而網(wǎng)絡(luò)存在不可到達(dá)性,這種分布式系統(tǒng)環(huán)境下,通過與不同的服務(wù)進(jìn)行網(wǎng)絡(luò)通信去完成事務(wù)稱之為分布式事務(wù)。
在分布式系統(tǒng)中分布式事務(wù)的場(chǎng)景很多:
例如用戶注冊(cè)送積分,銀行轉(zhuǎn)賬,創(chuàng)建訂單減庫存,這些都是分布式事務(wù)。
拿轉(zhuǎn)賬舉例:
我們知道本地事務(wù)依賴數(shù)據(jù)庫本身提供的事務(wù)特性來實(shí)現(xiàn),因此以下邏輯可以控制本地事務(wù):
Javabegin transaction; //1.本地?cái)?shù)據(jù)庫操作:張三減少金額 //2.本地?cái)?shù)據(jù)庫操作:李四增加金額 commit transation; |
---|
但是在分布式環(huán)境下,會(huì)變成下邊這樣:
Javabegin transaction; //1.本地?cái)?shù)據(jù)庫操作:張三減少金額 //2.遠(yuǎn)程調(diào)用:讓李四增加金額 commit transation; |
---|
可以設(shè)想,當(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ù)問題。
下邊的場(chǎng)景都會(huì)產(chǎn)生分布式事務(wù):
微服務(wù)架構(gòu)下:
單服務(wù)多數(shù)據(jù)庫:
多服務(wù)單數(shù)據(jù)庫:
4.2.2 什么是CAP理論控制分布式事務(wù)首先需要理解CAP理論,什么是CAP理論?
CAP是 Consistency、Availability、Partition tolerance三個(gè)詞語的縮寫,分別表示一致性、可用性、分區(qū)容忍性。
使用下邊的分布式系統(tǒng)結(jié)構(gòu) 進(jìn)行說明:
客戶端經(jīng)過網(wǎng)關(guān)訪問用戶服務(wù)的兩個(gè)結(jié)點(diǎn),一致性是指用戶不管訪問哪一個(gè)結(jié)點(diǎn)拿到的數(shù)據(jù)都是最新的,比如查詢小明的信息,不能出現(xiàn)在數(shù)據(jù)沒有改變的情況下兩次查詢結(jié)果不一樣。
可用性是指任何時(shí)候查詢用戶信息都可以查詢到結(jié)果,但不保證查詢到最新的數(shù)據(jù)。
分區(qū)容忍性也叫分區(qū)容錯(cuò)性,由于網(wǎng)絡(luò)通信異常導(dǎo)致請(qǐng)求中斷、消息丟失,但服務(wù)依然對(duì)外提供服務(wù)。
CAP理論要強(qiáng)調(diào)的是在分布式系統(tǒng)中這三點(diǎn)不可能全部滿足,由于是分布式系統(tǒng)就要滿足分區(qū)容忍性,因?yàn)榉?wù)之間難免出現(xiàn)網(wǎng)絡(luò)異常,不能因?yàn)榫植烤W(wǎng)絡(luò)異常導(dǎo)致整個(gè)系統(tǒng)不可用。
滿足P那么C和A不能同時(shí)滿足:
比如我們添加一個(gè)用戶小明的信息,該信息先添加到結(jié)點(diǎn)1中,再同步到結(jié)點(diǎn)2中,如下圖:
如果要滿足C一致性,必須等待小明的信息同步完成系統(tǒng)才可用(否則會(huì)出現(xiàn)請(qǐng)求到結(jié)點(diǎn)2時(shí)查詢不到數(shù)據(jù),違反了一致性),在信息同步過程中系統(tǒng)是不可用的,所以滿足C的同時(shí)無法滿足A。
如果要滿足A可用性,要時(shí)刻保證系統(tǒng)可用就不用等待信息同步完成,此時(shí)系統(tǒng)的一致性無法滿足。
所以在分布式系統(tǒng)中進(jìn)行分布式事務(wù)控制,要么保證CP、要么保證AP。
4.2.3 分布式事務(wù)控制方案學(xué)習(xí)CAP理論該如何控制分布式事務(wù)呢?
學(xué)習(xí)了CAP理論我們知道進(jìn)行分布式事務(wù)控制要在C和A中作出取舍,保證一致性就不要保證可用性,保證可用性就不要保證一致,首先你確認(rèn)是要CP還是AP,具體要根據(jù)應(yīng)用場(chǎng)景進(jìn)行判斷。
CP的場(chǎng)景:滿足C舍棄A,強(qiáng)調(diào)一致性。
跨行轉(zhuǎn)賬:一次轉(zhuǎn)賬請(qǐng)求要等待雙方銀行系統(tǒng)都完成整個(gè)事務(wù)才算完成,只要其中一個(gè)失敗另一方執(zhí)行回滾操作。
開戶操作:在業(yè)務(wù)系統(tǒng)開戶同時(shí)要在運(yùn)營(yíng)商開戶,任何一方開戶失敗該用戶都不可使用,所以要滿足CP。
AP的場(chǎng)景:滿足A舍棄C,強(qiáng)調(diào)可用性。
訂單退款,今日退款成功,明日賬戶到賬,只要用戶可以接受在一定時(shí)間內(nèi)到賬即可。
注冊(cè)送積分,注冊(cè)成功積分在24分到賬。
支付短信通信,支付成功發(fā)短信,短信發(fā)送可以有延遲,甚至沒有發(fā)送成功。
在實(shí)際應(yīng)用中符合AP的場(chǎng)景較多,其實(shí)雖然AP舍棄C一致性,實(shí)際上最終數(shù)據(jù)還是達(dá)到了一致,也就滿足了最終一致性,所以業(yè)界定義了BASE理論。
什么是BASE理論?
BASE 是 Basically Available(基本可用)、Soft state(軟狀態(tài))和 Eventually consistent (最終一致性)三個(gè)短語的縮寫。
基本可用:當(dāng)系統(tǒng)無法滿足全部可用時(shí)保證核心服務(wù)可用即可,比如一個(gè)外賣系統(tǒng),每到中午12點(diǎn)左右系統(tǒng)并發(fā)量很高,此時(shí)要保證下單流程涉及的服務(wù)可用,其它服務(wù)暫時(shí)不可用。
軟狀態(tài):是指可以存在中間狀態(tài),比如:打印自己的社保統(tǒng)計(jì)情況,該操作不會(huì)立即出現(xiàn)結(jié)果,而是提示你打印中,請(qǐng)?jiān)赬XX時(shí)間后查收。雖然出現(xiàn)了中間狀態(tài),但最終狀態(tài)是正確的。
最終一致性:退款操作后沒有及時(shí)到賬,經(jīng)過一定的時(shí)間后賬戶到賬,舍棄強(qiáng)一致性,滿足最終一致性。
4.2.4 課程發(fā)布分布式事務(wù)控制學(xué)習(xí)了這么多的理論,回到課程發(fā)布,執(zhí)行課程發(fā)布操作后要向數(shù)據(jù)庫、redis、elasticsearch、MinIO寫四份數(shù)據(jù),這個(gè)場(chǎng)景用哪種方案?
滿足CP?
如果要滿足CP就表示課程發(fā)布操作后向數(shù)據(jù)庫、redis、elasticsearch、MinIO寫四份數(shù)據(jù),只要有一份寫失敗其它的全部回滾。
滿足AP?
課程發(fā)布操作后,先更新數(shù)據(jù)庫中的課程發(fā)布狀態(tài),更新后向redis、elasticsearch、MinIO寫課程信息,只要在一定時(shí)間內(nèi)最終向redis、elasticsearch、MinIO寫數(shù)據(jù)成功即可。
課程發(fā)布滿足AP即可,使用BASE理論實(shí)現(xiàn)。
下圖是具體的技術(shù)方案:
1、在內(nèi)容管理服務(wù)的數(shù)據(jù)庫中添加一個(gè)消息表,消息表和課程發(fā)布表在同一個(gè)數(shù)據(jù)庫。
2、點(diǎn)擊課程發(fā)布通過本地事務(wù)向課程發(fā)布表寫入課程發(fā)布信息,同時(shí)向消息表寫課程發(fā)布的消息。兩條記錄保證同時(shí)存在或同時(shí)不存在。
3、啟動(dòng)任務(wù)調(diào)度系統(tǒng)定時(shí)調(diào)度內(nèi)容管理服務(wù)去定時(shí)掃描消息表的記錄。
4、當(dāng)掃描到課程發(fā)布的消息時(shí)即開始完成向redis、elasticsearch、MinIO同步數(shù)據(jù)的操作。
5、同步數(shù)據(jù)的任務(wù)完成后刪除消息表記錄。
時(shí)序圖如下:
下圖是課程發(fā)布操作的流程:
1、執(zhí)行發(fā)布操作,內(nèi)容管理服務(wù)存儲(chǔ)課程發(fā)布表的同時(shí)向消息表添加一條“課程發(fā)布任務(wù)”。這里使用本地事務(wù)保證課程發(fā)布信息保存成功,同時(shí)消息表也保存成功。
2、任務(wù)調(diào)度服務(wù)定時(shí)調(diào)度內(nèi)容管理服務(wù)掃描消息表,由于課程發(fā)布操作后向消息表插入一條課程發(fā)布任務(wù),此時(shí)掃描到一條任務(wù)。
3、拿到任務(wù)開始執(zhí)行任務(wù),分別向redis、elasticsearch及文件系統(tǒng)存儲(chǔ)數(shù)據(jù)。
4、任務(wù)完成后刪除消息表記錄。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧