聊聊分布式事務(wù)

前言

我們都知道數(shù)據(jù)庫的事務(wù)滿足"ACID"特性铆农,A是指事務(wù)的原子性,C是指事務(wù)的一致性发钝,I指事務(wù)的隔離性顿涣,D指持久性。
最開始我們的數(shù)據(jù)量都很小酝豪,所有的數(shù)據(jù)都落在一個(gè)數(shù)據(jù)庫中。MySQL數(shù)據(jù)庫單表的最大數(shù)據(jù)量在百萬條左右精堕,隨著系統(tǒng)變大孵淘,數(shù)據(jù)越來越多,這個(gè)時(shí)候我們不得不將數(shù)據(jù)分布在不同的數(shù)據(jù)庫中存放歹篓,也就是常說的數(shù)據(jù)分片(sharding)瘫证。我們可以通過一定的分庫策略將同一個(gè)交易鏈路上的數(shù)據(jù)放到一個(gè)數(shù)據(jù)庫中,例如我們可以將一個(gè)訂單所有產(chǎn)生的數(shù)據(jù)放到一個(gè)數(shù)據(jù)庫中庄撮,按照訂單號(hào)來分庫背捌,這樣我們?cè)谏捎唵蜗嚓P(guān)數(shù)據(jù)的時(shí)候可以在單個(gè)數(shù)據(jù)庫上開啟事務(wù)來完成。
這樣看似完美的解決方案其實(shí)并不完美洞斯。例如我們想記錄用戶維度的訂單數(shù)據(jù)時(shí)毡庆,這個(gè)方案就無能為力了。于是分布式事務(wù)應(yīng)運(yùn)而生烙如。

分布式系統(tǒng)CAP BASE理論

說到分布式系統(tǒng)么抗,不得不說CAP和BASE理論,它是指導(dǎo)我們分布式系統(tǒng)的理論基礎(chǔ)亚铁。

CAP理論

加州大學(xué)伯克利分校Eric Brewer教授支持一個(gè)分布式系統(tǒng)無法滿足這樣三條特性:

  1. Consistency蝇刀,一致性:多個(gè)操作同時(shí)生效,不會(huì)出現(xiàn)部分生效的情況
  2. Availability徘溢,可用性:客戶端的每個(gè)請(qǐng)求在服務(wù)端能夠正確被響應(yīng)
  3. Partition tolerance吞琐,分區(qū)容錯(cuò)性:分區(qū)中部分節(jié)點(diǎn)掛了不會(huì)影響整體服務(wù)可用性,這也是分布式系統(tǒng)最基本的要求

分區(qū)容錯(cuò)性是一個(gè)分布式系統(tǒng)最基本的要求然爆,因此一般分布式系統(tǒng)都會(huì)滿足分區(qū)容錯(cuò)性站粟,否則就失去了分布式系統(tǒng)的意義。分布式系統(tǒng)一般會(huì)在一致性和可用性上做出取舍施蜜。例如犧牲一致性換區(qū)可用性卒蘸,這里說的犧牲一致性是指犧牲掉系統(tǒng)的"強(qiáng)一致性",最終我們的系統(tǒng)還是一致的,即所謂的"弱一致性"或者"最終一致性"缸沃。當(dāng)我們的系統(tǒng)需要保證強(qiáng)一致性時(shí)我們不得不犧牲掉可用性:當(dāng)系統(tǒng)部分節(jié)點(diǎn)延遲或者down機(jī)整個(gè)系統(tǒng)的服務(wù)將變得不可用恰起,也因此系統(tǒng)數(shù)據(jù)是強(qiáng)一致性的。

BASE理論

BASE理論是對(duì)CAP理論的進(jìn)一步擴(kuò)充:

  1. Basically Available(基本可用)
  2. Soft state(軟狀態(tài))
  3. Eventually consistent(最終一致性)

基本可用是指我們的系統(tǒng)無法做到百分百可用趾牧,但是可以保證例如"3個(gè)9"(99.9%)可用检盼。軟狀態(tài)是指允許我們的系統(tǒng)存在中間狀態(tài),在最終我們的系統(tǒng)可以達(dá)到最終一致性翘单。BASE理論強(qiáng)調(diào)的是系統(tǒng)的最終一致性吨枉。

分布式事務(wù)

目前分布式事務(wù)的解決方案主要有:二階段提交(2PC)、柔性補(bǔ)償事務(wù)(TCC)哄芜、本地消息表(異步確保)貌亭、MQ事務(wù)消息等。

二階段提交

二階段事務(wù)分為兩個(gè)階段:階段一事務(wù)協(xié)調(diào)者通知各個(gè)節(jié)點(diǎn)執(zhí)行事務(wù)預(yù)提交认臊;階段二協(xié)調(diào)者根據(jù)各個(gè)節(jié)點(diǎn)的響應(yīng)來通知各個(gè)節(jié)點(diǎn)提交或者回滾事務(wù)操作圃庭。
兩階段提交這種解決方案屬于犧牲了一部分可用性來換取的一致性。
優(yōu)點(diǎn): 盡量保證了數(shù)據(jù)的強(qiáng)一致失晴,適合對(duì)數(shù)據(jù)強(qiáng)一致要求很高的關(guān)鍵領(lǐng)域剧腻。(其實(shí)也不能100%保證強(qiáng)一致)
缺點(diǎn): 實(shí)現(xiàn)復(fù)雜,犧牲了可用性涂屁,同步阻塞對(duì)性能影響較大书在,不適合高并發(fā)高性能場(chǎng)景。

二階段提交

補(bǔ)償事務(wù)(TCC)

TCC 其實(shí)就是采用的補(bǔ)償機(jī)制拆又,其核心思想是:針對(duì)每個(gè)操作儒旬,都要注冊(cè)一個(gè)與其對(duì)應(yīng)的確認(rèn)和補(bǔ)償(撤銷)操作。它分為三個(gè)階段:
Try 階段主要是對(duì)業(yè)務(wù)系統(tǒng)做檢測(cè)及資源預(yù)留
Confirm 階段主要是對(duì)業(yè)務(wù)系統(tǒng)做確認(rèn)提交遏乔,Try階段執(zhí)行成功并開始執(zhí)行 Confirm階段時(shí)义矛,默認(rèn) Confirm階段是不會(huì)出錯(cuò)的。即:只要Try成功盟萨,Confirm一定成功凉翻。
Cancel 階段主要是在業(yè)務(wù)執(zhí)行錯(cuò)誤,需要回滾的狀態(tài)下執(zhí)行的業(yè)務(wù)取消捻激,預(yù)留資源釋放制轰。
舉個(gè)例子,假入 Bob 要向 Smith 轉(zhuǎn)賬胞谭,思路大概是:
我們有一個(gè)本地方法垃杖,里面依次調(diào)用

  1. 首先在 Try 階段,要先調(diào)用遠(yuǎn)程接口把 Smith 和 Bob 的錢給凍結(jié)起來丈屹。
  2. 在 Confirm 階段调俘,執(zhí)行遠(yuǎn)程調(diào)用的轉(zhuǎn)賬的操作伶棒,轉(zhuǎn)賬成功進(jìn)行解凍。
  3. 如果第2步執(zhí)行成功彩库,那么轉(zhuǎn)賬成功肤无,如果第二步執(zhí)行失敗,則調(diào)用遠(yuǎn)程凍結(jié)接口對(duì)應(yīng)的解凍方法 (Cancel)骇钦。
    優(yōu)點(diǎn): 跟2PC比起來宛渐,實(shí)現(xiàn)以及流程相對(duì)簡(jiǎn)單了一些,但數(shù)據(jù)的一致性比2PC也要差一些
    缺點(diǎn): 缺點(diǎn)還是比較明顯的眯搭,在2,3步中都有可能失敗窥翩。TCC屬于應(yīng)用層的一種補(bǔ)償方式,所以需要程序員在實(shí)現(xiàn)的時(shí)候多寫很多補(bǔ)償?shù)拇a鳞仙,在一些場(chǎng)景中寇蚊,一些業(yè)務(wù)流程可能用TCC不太好定義及處理。
TCC柔性事務(wù)

本地消息表(異步確保)

本地消息表這種實(shí)現(xiàn)方式應(yīng)該是業(yè)界使用最多的繁扎,其核心思想是將分布式事務(wù)拆分成本地事務(wù)進(jìn)行處理幔荒,這種思路是來源于ebay。我們可以從下面的流程圖中看出其中的一些細(xì)節(jié):

本地消息表

基本思路就是:
消息生產(chǎn)方梳玫,需要額外建一個(gè)消息表,并記錄消息發(fā)送狀態(tài)右犹。消息表和業(yè)務(wù)數(shù)據(jù)要在一個(gè)事務(wù)里提交提澎,也就是說他們要在一個(gè)數(shù)據(jù)庫里面。然后消息會(huì)經(jīng)過MQ發(fā)送到消息的消費(fèi)方念链。如果消息發(fā)送失敗盼忌,會(huì)進(jìn)行重試發(fā)送。
消息消費(fèi)方掂墓,需要處理這個(gè)消息谦纱,并完成自己的業(yè)務(wù)邏輯。此時(shí)如果本地事務(wù)處理成功君编,表明已經(jīng)處理成功了跨嘉,如果處理失敗吃嘿,那么就會(huì)重試執(zhí)行祠乃。如果是業(yè)務(wù)上面的失敗,可以給生產(chǎn)方發(fā)送一個(gè)業(yè)務(wù)補(bǔ)償消息兑燥,通知生產(chǎn)方進(jìn)行回滾等操作黄橘。
生產(chǎn)方和消費(fèi)方定時(shí)掃描本地消息表蓖康,把還沒處理完成的消息或者失敗的消息再發(fā)送一遍。如果有靠譜的自動(dòng)對(duì)賬補(bǔ)賬邏輯,這種方案還是非常實(shí)用的怠益。
這種方案遵循BASE理論驱富,采用的是最終一致性,筆者認(rèn)為是這幾種方案里面比較適合實(shí)際業(yè)務(wù)場(chǎng)景的,即不會(huì)出現(xiàn)像2PC那樣復(fù)雜的實(shí)現(xiàn)(當(dāng)調(diào)用鏈很長的時(shí)候沛膳,2PC的可用性是非常低的),也不會(huì)像TCC那樣可能出現(xiàn)確認(rèn)或者回滾不了的情況馍盟。
優(yōu)點(diǎn): 一種非常經(jīng)典的實(shí)現(xiàn)于置,避免了分布式事務(wù),實(shí)現(xiàn)了最終一致性贞岭。
缺點(diǎn): 消息表會(huì)耦合到業(yè)務(wù)系統(tǒng)中八毯,如果沒有封裝好的解決方案,會(huì)有很多雜活需要處理瞄桨。

MQ事務(wù)消息

有一些第三方的MQ是支持事務(wù)消息的话速,比如RocketMQ,他們支持事務(wù)消息的方式也是類似于采用的二階段提交芯侥,但是市面上一些主流的MQ都是不支持事務(wù)消息的泊交,比如 RabbitMQ 和 Kafka 都不支持。
以阿里的 RocketMQ 中間件為例柱查,其思路大致為:
第一階段Prepared消息廓俭,會(huì)拿到消息的地址。
第二階段執(zhí)行本地事務(wù)唉工,第三階段通過第一階段拿到的地址去訪問消息研乒,并修改狀態(tài)。
也就是說在業(yè)務(wù)方法內(nèi)要想消息隊(duì)列提交兩次請(qǐng)求淋硝,一次發(fā)送消息和一次確認(rèn)消息雹熬。如果確認(rèn)消息發(fā)送失敗了RocketMQ會(huì)定期掃描消息集群中的事務(wù)消息,這時(shí)候發(fā)現(xiàn)了Prepared消息谣膳,它會(huì)向消息發(fā)送者確認(rèn)竿报,所以生產(chǎn)方需要實(shí)現(xiàn)一個(gè)check接口,RocketMQ會(huì)根據(jù)發(fā)送端設(shè)置的策略來決定是回滾還是繼續(xù)發(fā)送確認(rèn)消息继谚。這樣就保證了消息發(fā)送與本地事務(wù)同時(shí)成功或同時(shí)失敗烈菌。

優(yōu)點(diǎn): 實(shí)現(xiàn)了最終一致性,不需要依賴本地?cái)?shù)據(jù)庫事務(wù)犬庇。
缺點(diǎn): 實(shí)現(xiàn)難度大僧界,主流MQ不支持。

MQ事務(wù)消息

總結(jié)

  1. 目前分布式事務(wù)主要有:二階段提交臭挽、TCC柔性事務(wù)捂襟、本地消息表(異步確保)和MQ事務(wù)消息等解決方案。二階段提交可以確保數(shù)據(jù)的強(qiáng)一致性欢峰,其他的解決方案屬于最終一致性解決方案葬荷。
  2. 分布式事務(wù)雖然能保證數(shù)據(jù)的強(qiáng)一致性涨共,但是性能低。使用前需要確定是否真的需要分布式事務(wù)宠漩。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末举反,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子扒吁,更是在濱河造成了極大的恐慌火鼻,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,589評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雕崩,死亡現(xiàn)場(chǎng)離奇詭異魁索,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)盼铁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,615評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門粗蔚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人饶火,你說我怎么就攤上這事鹏控。” “怎么了肤寝?”我有些...
    開封第一講書人閱讀 165,933評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵当辐,是天一觀的道長。 經(jīng)常有香客問我鲤看,道長瀑构,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評(píng)論 1 295
  • 正文 為了忘掉前任刨摩,我火速辦了婚禮,結(jié)果婚禮上世吨,老公的妹妹穿的比我還像新娘澡刹。我一直安慰自己,他們只是感情好耘婚,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,999評(píng)論 6 393
  • 文/花漫 我一把揭開白布罢浇。 她就那樣靜靜地躺著,像睡著了一般沐祷。 火紅的嫁衣襯著肌膚如雪嚷闭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,775評(píng)論 1 307
  • 那天赖临,我揣著相機(jī)與錄音胞锰,去河邊找鬼。 笑死兢榨,一個(gè)胖子當(dāng)著我的面吹牛嗅榕,可吹牛的內(nèi)容都是我干的顺饮。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼凌那,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼兼雄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起帽蝶,我...
    開封第一講書人閱讀 39,359評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤赦肋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后励稳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體佃乘,經(jīng)...
    沈念sama閱讀 45,854評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,007評(píng)論 3 338
  • 正文 我和宋清朗相戀三年麦锯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了恕稠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,146評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡扶欣,死狀恐怖鹅巍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情料祠,我是刑警寧澤骆捧,帶...
    沈念sama閱讀 35,826評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站髓绽,受9級(jí)特大地震影響敛苇,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜顺呕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,484評(píng)論 3 331
  • 文/蒙蒙 一枫攀、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧株茶,春花似錦来涨、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至僵闯,卻和暖如春卧抗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背鳖粟。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評(píng)論 1 272
  • 我被黑心中介騙來泰國打工社裆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人牺弹。 一個(gè)月前我還...
    沈念sama閱讀 48,420評(píng)論 3 373
  • 正文 我出身青樓浦马,卻偏偏與公主長得像时呀,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子晶默,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,107評(píng)論 2 356

推薦閱讀更多精彩內(nèi)容

  • 聊聊分布式事務(wù)磺陡,再說說解決方案 分布式事務(wù)是企業(yè)集成中的一個(gè)技術(shù)難點(diǎn)趴梢,也是每一個(gè)分布式系統(tǒng)架構(gòu)中都會(huì)涉及到的一個(gè)東...
    名猿閱讀 5,242評(píng)論 1 66
  • 前言 最近很久沒有寫博客了坞靶,一方面是因?yàn)楣臼虑樽罱容^忙,另外一方面是因?yàn)樵谶M(jìn)行CAP的下一階段的開發(fā)工作蝴悉,不過...
    暗夜精靈_NightElf閱讀 318評(píng)論 0 1
  • 分布式事務(wù)是企業(yè)集成中的一個(gè)技術(shù)難點(diǎn)拍冠,也是每一個(gè)分布式系統(tǒng)架構(gòu)中都會(huì)涉及到的一個(gè)東西尿这,特別是在微服務(wù)架構(gòu)中,幾乎可...
    程序員技術(shù)圈閱讀 1,941評(píng)論 1 81
  • 1 背景 一致性是一個(gè)抽象的庆杜、具有多重含義的計(jì)算機(jī)術(shù)語射众,在不同應(yīng)用場(chǎng)景下,有不同的定義和含義晃财。在傳統(tǒng)的IT時(shí)代叨橱,一...
    新強(qiáng)吖閱讀 453評(píng)論 0 2
  • 打羽毛球1小時(shí),keep15分鐘
    偉大的何東閱讀 158評(píng)論 0 1