IT技術互動交流平台(tai)

喜洋洋彩票官网

作(zuo)者︰biakia  來源︰IT165收集  發布(bu)日期︰2020-02-26 02:21:17

我(wo)在上一期介紹了spring的事務原理(詳情見《深入理解spring事務原理》),Spring事務本質(zhi)是單機下的事務,是由(you)數據(ju)庫本身(shen)保(bao)證(zheng)的。今(jin)天,我(wo)將介紹一種比較復(fu)雜的事務︰分布(bu)式事務。

1、什麼ci)欠植bu)式事務

分布(bu)式事務就是指事務的參與(yu)者、支持zhi)攣竦姆衿鰲 試捶衿饕約笆攣窆芾砥鞣直bie)位于(yu)不同的分布(bu)式系di)車牟煌 jie)點之上。以上是百度百科(ke)的解釋,簡單的說,就是一次大的操(cao)作(zuo)由(you)不同的小操(cao)作(zuo)組成,這些(xie)小的操(cao)作(zuo)分布(bu)在不同的服務器上,且屬于(yu)不同的應用,分布(bu)式事務需要保(bao)證(zheng)這些(xie)小操(cao)作(zuo)要麼全部成功,要麼全部失敗。本質(zhi)上來ci)擔 植bu)式事務就是為了保(bao)證(zheng)不同數據(ju)庫的數據(ju)一致性(xing)。

2、分布(bu)式事務的產生的nao) /h4>

喜洋洋彩票官网

當數據(ju)庫單表一年(nian)產生的數據(ju)超過1000W,那麼就要考(kao)慮(lv)分庫分表,具體分庫分表的nao) 碓詿ci)不做(zuo)解釋,以後(hou)有(you)空詳細說,簡單的說就是原來的一個數據(ju)庫變(bian)成了多個數據(ju)庫。這時候,如果一個操(cao)作(zuo)既(ji)訪問01庫,又訪問02庫,而且要保(bao)證(zheng)數據(ju)的一致性(xing),那麼就要用到(dao)分布(bu)式事務。

喜洋洋彩票官网

所謂的SOA化(hua),就是業務的服務化(hua)。比如原來單機支撐了整個電商網站(zhan),現在對(dui)整個網站(zhan)進行拆解,分離出了訂單中心、用mei)?行摹 獯嬤行摹6dui)于(yu)訂單中心,有(you)專門(men)的數據(ju)庫存儲訂單信息,用mei)?行囊燦you)專門(men)的數據(ju)庫存儲用mei) 畔  獯嬤行囊不hui)有(you)專門(men)的數據(ju)庫存儲庫存信息。這時候如果要同時對(dui)訂單和(he)庫存進行操(cao)作(zuo),那麼就會(hui)涉及到(dao)訂單數據(ju)庫和(he)庫存數據(ju)庫,為了保(bao)證(zheng)數據(ju)一致性(xing),就需要用到(dao)分布(bu)式事務。

以上xia)liang)種情況表象不同,但是本質(zhi)相同,都是因為要操(cao)作(zuo)的數據(ju)庫變(bian)多了!

3、事務的ACID特性(xing)

喜洋洋彩票官网

所謂的nao) zi)性(xing)就是說,在整個事務中的所有(you)操(cao)作(zuo),要麼全部完成,要麼全部不做(zuo),沒(mei)有(you)中間狀態。對(dui)于(yu)事務在執行中發生錯(cuo)誤,所有(you)的操(cao)作(zuo)都會(hui)被(bei)回滾,整個事務就像從沒(mei)被(bei)執行過一樣。

喜洋洋彩票官网

事務的執行必須保(bao)證(zheng)系di)車囊恢灤xing),就拿轉賬(zhang)為例(li),A有(you)500元,B有(you)300元,如果在一個事務里A成功轉給(gei)B50元,那麼不管並發多少,不管發生什麼,只(zhi)要事務執行成功了,那麼最後(hou)A賬(zhang)戶一定是450元,B賬(zhang)戶一定是350元。

喜洋洋彩票官网

所謂的隔(ge)離性(xing)就是說,事務與(yu)事務之間不huan)嶧?嚶ying)響,一個事務的中間狀態不huan)岊bei)其他事務感知。

喜洋洋彩票官网

所謂的持久(jiu)性(xing),就是說一單事務完成了,那麼ci)攣穸dui)數據(ju)所做(zuo)的變(bian)更就完全保(bao)存在了數據(ju)庫中,即ci)狗?5紓 低(di)沖椿彩僑鞜ci)。

4、分布(bu)式事務的應用場景

喜洋洋彩票官网

最經典的場景就是支付了,一筆支付,是對(dui)買家(jia)賬(zhang)戶進行扣(kou)款,同時對(dui)賣家(jia)賬(zhang)戶進行加錢,這些(xie)操(cao)作(zuo)必須在一個事務里執行,要麼全部成功,要麼全部失敗。而對(dui)于(yu)買家(jia)賬(zhang)戶屬于(yu)買家(jia)中心,對(dui)應的是買家(jia)數據(ju)庫,而賣家(jia)賬(zhang)戶屬于(yu)賣家(jia)中心,對(dui)應的是賣家(jia)數據(ju)庫,對(dui)不同數據(ju)庫的操(cao)作(zuo)必然需要引入分布(bu)式事務。

喜洋洋彩票官网

買家(jia)在電商平台(tai)下單,往往會(hui)涉及到(dao)兩(liang)個動作(zuo),一個是扣(kou)庫存,第二個是更新訂單狀態,庫存和(he)訂單一般屬于(yu)不同的數據(ju)庫,需要使用分布(bu)式事務保(bao)證(zheng)數據(ju)一致性(xing)。

5、常見的分布(bu)式事務解決(jue)方(fang)案(an)

喜洋洋彩票官网

XA是一個分布(bu)式事務協議,由(you)Tuxedo提出。XA中xie)籩路(lu)治 liang)部分︰事務管理器和(he)本地資源管理器。其中本地資源管理器往往由(you)數據(ju)庫實(shi)現,比如Oracle、DB2這些(xie)商業數據(ju)庫都實(shi)現了XA接(jie)口,而事務管理器作(zuo)為全局的調度者,負責各個本地資源的提交和(he)回滾。XA實(shi)現分布(bu)式事務的nao) 砣縵攏/p>

總的來ci)擔A協議比較簡單,而且一旦商業數據(ju)庫實(shi)現了XA協議,使用分布(bu)式事務的成本也比較低(di)。但是,XA也有(you)致命的缺點,那就是性(xing)能不理想(xiang),特別(bie)是在交易(yi)下單鏈路(lu),往往並發量很高,XA無法滿(man)足高並發場景。XA目(mu)前在商業數據(ju)庫支持的比較理想(xiang),在mysql數據(ju)庫中支持的不太理想(xiang),mysql的XA實(shi)現,沒(mei)有(you)記錄(lu)prepare階(jie)段日志,主備切換(huan)回導致主庫與(yu)備庫數據(ju)不一致。許多nosql也沒(mei)有(you)支持XA,這讓XA的應用場景變(bian)得非常狹(xia)隘(ai)。

喜洋洋彩票官网

所謂的消息事務就是基于(yu)消息中間件的兩(liang)階(jie)段提交,本質(zhi)上是對(dui)消息中間件的一種特殊利用,它(ta)是將本地事務和(he)發消息放在了一個分布(bu)式事務里,保(bao)證(zheng)要麼本地操(cao)作(zuo)成功成功並且對(dui)外發消息成功,要麼兩(liang)者都失敗,開源的RocketMQ就支持這一特性(xing),具體原理如下︰

1、A系di)誠螄 屑浼?鴕惶踉?趕br />2、消息中間件保(bao)存預備消息並返回成功
3、A執行本地事務
4、A發送提交消息給(gei)消息中間件

通(tong)過以上4步完成了一個消息事務。對(dui)于(yu)以上的4個步驟,每個步驟都可能產生錯(cuo)誤,下面(mian)一一分析︰

步驟一出錯(cuo),則整個事務失敗,不huan)嶂蔥的本地操(cao)作(zuo) 步驟二出錯(cuo),則整個事務失敗,不huan)嶂蔥的本地操(cao)作(zuo) 步驟三出錯(cuo),這時候需要回滾預備消息,怎麼回滾?答案(an)是A系di)呈shi)現一個消息中間件的回調接(jie)口,消息中間件會(hui)去不斷執行回調接(jie)口,檢(jian)查A事務執行是否執行成功,如果失敗則回滾預備消息 步驟四出錯(cuo),這時候A的本地事務是成功的,那麼消息中間件要回滾A嗎?答案(an)是不需要,其實(shi)通(tong)過回調接(jie)口,消息中間件能夠檢(jian)查到(dao)A執行成功了,這時候其實(shi)不需要A發提交消息了,消息中間件可以自己對(dui)消息進行提交,從而完成整個消息事務

基于(yu)消息中間件的兩(liang)階(jie)段提交往往用在高並發場景下,將一個分布(bu)式事務拆成一個消息事務(A系di)車謀鏡夭cao)作(zuo)+發消息)+B系di)車謀鏡夭cao)作(zuo),其中B系di)車牟cao)作(zuo)由(you)消息驅動,只(zhi)要消息事務成功,那麼A操(cao)作(zuo)一定成功,消息也一定發出來了,這時候B會(hui)收到(dao)消息去執行本地操(cao)作(zuo),如果本地操(cao)作(zuo)失敗,消息會(hui)重投,直到(dao)B操(cao)作(zuo)成功,這樣就變(bian)相地實(shi)現了A與(yu)B的分布(bu)式事務。原理如下︰

雖然上面(mian)的方(fang)案(an)能夠完成A和(he)B的操(cao)作(zuo),但是A和(he)B並不是嚴格一致的,而是最終一致的,我(wo)們(men)在這里犧(xi)牲了一致性(xing),換(huan)來了性(xing)能的大幅(fu)度提升。當然,這種玩法也是有(you)風險的,如果B一直執行不成功,那麼一致性(xing)會(hui)被(bei)破(po)壞,具體要不要玩,還是得看業務能夠承擔多少風險。

喜洋洋彩票官网

所謂的TCC編(bian)程模式,也是兩(liang)階(jie)段提交的一個變(bian)種。TCC提供了一個編(bian)程框架,將整個業務邏輯分為三塊︰Try、Confirm和(he)Cancel三個操(cao)作(zuo)。以在線下單為例(li),Try階(jie)段會(hui)去扣(kou)庫存,Confirm階(jie)段則是去更新訂單狀態,如果更新訂單失敗,則進入Cancel階(jie)段,會(hui)去恢復(fu)庫存。總之,TCC就是通(tong)過代(dai)碼人為實(shi)現了兩(liang)階(jie)段提交,不同的業務場景所寫(xie)的代(dai)碼都不一樣,復(fu)雜度也不一樣,因此(ci),這種模式並不能很好地被(bei)復(fu)用。

6、總結

分布(bu)式事務,本質(zhi)上是對(dui)多個數據(ju)庫的事務進行統一控(kong)制,按照控(kong)制力度可以分為︰不控(kong)制、部分控(kong)制和(he)完全控(kong)制。不控(kong)制就是不引入分布(bu)式事務,部分控(kong)制就是各種變(bian)種的兩(liang)階(jie)段提交,包括上面(mian)提到(dao)的消息事務+最終一致性(xing)、TCC模式,而完全控(kong)制就是完全實(shi)現兩(liang)階(jie)段提交。部分控(kong)制的好處是並發量和(he)性(xing)能很好,缺點是數據(ju)一致性(xing)減弱了,完全控(kong)制則是犧(xi)牲了性(xing)能,保(bao)障xia)艘恢灤xing),具體用哪種方(fang)式,最終還是取決(jue)于(yu)業務場景。作(zuo)為技術人員bao) 歡 荒芡wang)了技術是為業務服務的,不要為了技術而技術,針對(dui)不同業務進行技術選型也是一種很重要的能力!

========================================================

如果覺(jue)得mei)共淮cuo),請隨意打賞

Tag標簽︰分布(bu)式  事務  
  • 喜洋洋彩票官网

About IT165 - 廣(guang)告服務 - 隱私聲明 - 版權申明 - 免責條款 - 網站(zhan)地圖 - 網友投稿 - 聯系方(fang)式
本站(zhan)內容來自于(yu)互聯網,僅供用于(yu)網絡(luo)技術學習,學習中請遵循相關法律法規(gui)
喜洋洋彩票官网 | 下一页