掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
作者:佚名 2017-09-19 09:36:24
開發(fā)
架構(gòu)
分布式 根據(jù)微服務(wù)架構(gòu)的鼻祖 Martin Fowler 的忠告,微服務(wù)架構(gòu)中應(yīng)當(dāng)盡量避免分布式事務(wù)。然而,在某些領(lǐng)域,分布式事務(wù)如同宿命中的對(duì)手無(wú)法避免。

成都創(chuàng)新互聯(lián)公司專業(yè)提供成都機(jī)柜租用服務(wù),為用戶提供五星數(shù)據(jù)中心、電信、雙線接入解決方案,用戶可自行在線購(gòu)買成都機(jī)柜租用服務(wù),并享受7*24小時(shí)金牌售后服務(wù)。
根據(jù)微服務(wù)架構(gòu)的鼻祖 Martin Fowler 的忠告,微服務(wù)架構(gòu)中應(yīng)當(dāng)盡量避免分布式事務(wù)。然而,在某些領(lǐng)域,分布式事務(wù)如同宿***的對(duì)手無(wú)法避免。
在工程領(lǐng)域,分布式事務(wù)的討論主要聚焦于強(qiáng)一致性和最終一致性的解決方案。
典型方案包括:
一致性理論
分布式事務(wù)的目的是保障分庫(kù)數(shù)據(jù)一致性,而跨庫(kù)事務(wù)會(huì)遇到各種不可控制的問(wèn)題,如個(gè)別節(jié)點(diǎn)***性宕機(jī),像單機(jī)事務(wù)一樣的 ACID 是無(wú)法奢望的。
另外,業(yè)界著名的 CAP 理論也告訴我們,對(duì)分布式系統(tǒng),需要將數(shù)據(jù)一致性和系統(tǒng)可用性、分區(qū)容忍性放在天平上一起考慮。
兩階段提交協(xié)議(簡(jiǎn)稱2PC)是實(shí)現(xiàn)分布式事務(wù)較為經(jīng)典的方案,但 2PC 的可擴(kuò)展性很差,在分布式架構(gòu)下應(yīng)用代價(jià)較大,eBay 架構(gòu)師 Dan Pritchett 提出了 BASE 理論,用于解決大規(guī)模分布式系統(tǒng)下的數(shù)據(jù)一致性問(wèn)題。
BASE 理論告訴我們:可以通過(guò)放棄系統(tǒng)在每個(gè)時(shí)刻的強(qiáng)一致性來(lái)?yè)Q取系統(tǒng)的可擴(kuò)展性。
01.CAP 理論
在分布式系統(tǒng)中,一致性(Consistency)、可用性(Availability)和分區(qū)容忍性(Partition Tolerance)3 個(gè)要素最多只能同時(shí)滿足兩個(gè),不可兼得。其中,分區(qū)容忍性又是不可或缺的。
舉例:Cassandra、Dynamo 等,默認(rèn)優(yōu)先選擇 AP,弱化 C;HBase、MongoDB 等,默認(rèn)優(yōu)先選擇 CP,弱化 A。
02.BASE 理論
核心思想:
一致性模型
數(shù)據(jù)的一致性模型可以分成以下三類:
分布式系統(tǒng)數(shù)據(jù)的強(qiáng)一致性、弱一致性和最終一致性可以通過(guò) Quorum NRW 算法分析。
分布式事務(wù)解決方案
01.2PC 方案——強(qiáng)一致性
2PC 的核心原理是通過(guò)提交分階段和記日志的方式,記錄下事務(wù)提交所處的階段狀態(tài),在組件宕機(jī)重啟后,可通過(guò)日志恢復(fù)事務(wù)提交的階段狀態(tài),并在這個(gè)狀態(tài)節(jié)點(diǎn)重試。
如 Coordinator 重啟后,通過(guò)日志可以確定提交處于 Prepare 還是 Prepare All 狀態(tài)。若是前者,說(shuō)明有節(jié)點(diǎn)可能沒有 Prepare 成功,或所有節(jié)點(diǎn) Prepare 成功但還沒有下發(fā) Commit,狀態(tài)恢復(fù)后給所有節(jié)點(diǎn)下發(fā) RollBack。
若是 Prepare All 狀態(tài),需要給所有節(jié)點(diǎn)下發(fā) Commit,數(shù)據(jù)庫(kù)節(jié)點(diǎn)需要保證 Commit 冪等。
2PC 方案的三個(gè)問(wèn)題:
升級(jí)的 3PC 方案旨在解決這些問(wèn)題,主要有兩個(gè)改進(jìn):
但三階段提交也存在一些缺陷,要徹底從協(xié)議層面避免數(shù)據(jù)不一致,可以采用 Paxos 或者 Raft 算法。
02.eBay 事件隊(duì)列方案——最終一致性
eBay 的架構(gòu)師 Dan Pritchett,曾在一篇解釋 BASE 原理的論文《Base:An Acid Alternative》中提到一個(gè) eBay 分布式系統(tǒng)一致性問(wèn)題的解決方案。
它的核心思想是將需要分布式處理的任務(wù)通過(guò)消息或者日志的方式來(lái)異步執(zhí)行,消息或日志可以存到本地文件、數(shù)據(jù)庫(kù)或消息隊(duì)列,再通過(guò)業(yè)務(wù)規(guī)則進(jìn)行失敗重試,它要求各服務(wù)的接口是冪等的。
描述的場(chǎng)景為,有用戶表 user 和交易表 transaction,用戶表存儲(chǔ)用戶信息、總銷售額和總購(gòu)買額。交易表存儲(chǔ)每一筆交易的流水號(hào)、買家信息、賣家信息和交易金額。如果產(chǎn)生了一筆交易,需要在交易表增加記錄,同時(shí)還要修改用戶表的金額。
論文中提出的解決方法是將更新交易表記錄和用戶表更新消息放在一個(gè)本地事務(wù)來(lái)完成,為了避免重復(fù)消費(fèi)用戶表更新消息帶來(lái)的問(wèn)題,增加一個(gè)操作記錄表 updates_applied 來(lái)記錄已經(jīng)完成的交易相關(guān)的信息。
這個(gè)方案的核心在于第二階段的重試和冪等執(zhí)行。失敗后重試,這是一種補(bǔ)償機(jī)制,它是能保證系統(tǒng)最終一致的關(guān)鍵流程。
03.TCC (Try-Confirm-Cancel)補(bǔ)償模式——最終一致性
某業(yè)務(wù)模型如圖,由服務(wù) A、服務(wù) B、服務(wù) C、服務(wù) D 共同組成的一個(gè)微服務(wù)架構(gòu)系統(tǒng)。服務(wù) A 需要依次調(diào)用服務(wù) B、服務(wù) C 和服務(wù) D 共同完成一個(gè)操作。
當(dāng)服務(wù) A 調(diào)用服務(wù) D 失敗時(shí),若要保證整個(gè)系統(tǒng)數(shù)據(jù)的一致性,就要對(duì)服務(wù) B 和服務(wù) C 的 invoke 操作進(jìn)行回滾,執(zhí)行反向的 revert 操作。回滾成功后,整個(gè)微服務(wù)系統(tǒng)是數(shù)據(jù)一致的。
實(shí)現(xiàn)的三個(gè)關(guān)鍵要素:
實(shí)現(xiàn)的兩個(gè)難點(diǎn):
04.緩存數(shù)據(jù)最終一致性
在我們的業(yè)務(wù)系統(tǒng)中,緩存(Redis 或者 Memcached)通常被用在數(shù)據(jù)庫(kù)前面,作為數(shù)據(jù)讀取的緩沖,使得 I/O 操作不至于直接落在數(shù)據(jù)庫(kù)上。
以商品詳情頁(yè)為例,假如賣家修改了商品信息,并寫回到數(shù)據(jù)庫(kù),但是這時(shí)候用戶從商品詳情頁(yè)看到的信息還是從緩存中拿到的過(guò)時(shí)數(shù)據(jù),這就出現(xiàn)了緩存系統(tǒng)和數(shù)據(jù)庫(kù)系統(tǒng)中的數(shù)據(jù)不一致的現(xiàn)象。
要解決該場(chǎng)景下緩存和數(shù)據(jù)庫(kù)數(shù)據(jù)不一致的問(wèn)題,我們有以下兩種解決方案:
選擇建議
在面臨數(shù)據(jù)一致性問(wèn)題的時(shí)候,首先要從業(yè)務(wù)需求的角度出發(fā),確定我們對(duì)于三種一致性模型的接受程度,再通過(guò)具體場(chǎng)景來(lái)決定解決方案。
從應(yīng)用角度看,分布式事務(wù)的現(xiàn)實(shí)場(chǎng)景常常無(wú)法規(guī)避,在有能力給出其他解決方案前,2PC 也是一個(gè)不錯(cuò)的選擇。
對(duì)購(gòu)物轉(zhuǎn)賬等電商和金融業(yè)務(wù),中間件層的 2PC ***問(wèn)題在于業(yè)務(wù)不可見,一旦出現(xiàn)不可抗力或意想不到的一致性破壞。
如數(shù)據(jù)節(jié)點(diǎn)***性宕機(jī),業(yè)務(wù)難以根據(jù) 2PC 的日志進(jìn)行補(bǔ)償。金融場(chǎng)景下,數(shù)據(jù)一致性是命根,業(yè)務(wù)需要對(duì)數(shù)據(jù)有***的掌控力。
建議使用 TCC 這類分布式事務(wù)模型,或基于消息隊(duì)列的柔性事務(wù)框架,這兩種方案都在業(yè)務(wù)層實(shí)現(xiàn),業(yè)務(wù)開發(fā)者具有足夠掌控力,可以結(jié)合 SOA 框架來(lái)架構(gòu),包括 Dubbo、Spring Cloud 等。

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢/運(yùn)營(yíng)咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流