1 背景
市面上常見(jiàn)的有,2pc/3pc、tcc、saga 等常見(jiàn)的分布式事務(wù)解決方案,但是實(shí)際實(shí)施起來(lái)框架比較重,設(shè)計(jì)開(kāi)發(fā)比較繁瑣,不易于快速開(kāi)發(fā)上手。本文提供一種基于柔性事務(wù)設(shè)計(jì)的簡(jiǎn)單易上手的分布式事務(wù)設(shè)計(jì)方案,用于解決常見(jiàn)的分布式事務(wù)常見(jiàn)場(chǎng)景。
2 常見(jiàn)分布式事務(wù)場(chǎng)景
2.1 同步場(chǎng)景
常見(jiàn)的場(chǎng)景,方法內(nèi)依賴外部微服務(wù)多個(gè)同步接口,等同步接口返回再展開(kāi)后續(xù)邏輯,如下圖 1 描述。

圖 1 分布式事務(wù)同步場(chǎng)景 存在的問(wèn)題:B/C 失敗后,A/B 不能回滾,造成數(shù)據(jù)不一致?
2.2 異步場(chǎng)景
方法內(nèi)依賴外部微服務(wù)多個(gè)同步接口同時(shí),本地事務(wù)提交并發(fā)出異步 MQ,如下圖 2 描述。

圖 2 分布式事務(wù)異步場(chǎng)景 存在的問(wèn)題:詢價(jià)系統(tǒng)無(wú)法保證本地事務(wù)和 mq 消息的發(fā)送同時(shí)成功或失敗,會(huì)造成數(shù)據(jù)不一致。
3 解決方案
3.1 數(shù)據(jù)模型設(shè)計(jì)
事務(wù)表:記錄每次同步方法執(zhí)行的狀態(tài),包括:1 - 進(jìn)行中(同步方法執(zhí)行開(kāi)始)、2 - 已完成(同步方法執(zhí)行成功)、3 - 失?。ㄍ椒椒▓?zhí)行失?。?、4 - 已回滾(回滾方法執(zhí)行成功); 方法調(diào)用表:記錄一個(gè)完整的事務(wù)內(nèi)所有方法的執(zhí)行前入?yún)?、同步方?a target="_blank">接口、回滾接口、回滾入?yún)ⅰ⒎椒▓?zhí)行順序,如下圖 3 描述:

圖 3 事務(wù)服務(wù)數(shù)據(jù)模型
3.2 設(shè)計(jì)原理
原理:一個(gè)完整事務(wù)內(nèi),1. 首先每個(gè)方法提供回滾接口,其次,事務(wù)內(nèi)每次同步方法執(zhí)行時(shí),優(yōu)先維護(hù)入?yún)?shù)據(jù)到事務(wù)表,方便后續(xù)做回滾補(bǔ)償;2. 整個(gè)事務(wù)內(nèi)某一個(gè)方法執(zhí)行失敗時(shí),結(jié)束整個(gè)事務(wù),并更新事務(wù)表狀態(tài) = 失??;3. 事務(wù)表通過(guò)輪詢狀態(tài) status=3 (失敗) 事務(wù),調(diào)用回滾接口,利用回滾入?yún)⑦M(jìn)行接口補(bǔ)償;4. 回滾邏輯:找到事務(wù)表中失敗的執(zhí)行方法的順序值,只調(diào)用小于失敗順序值的所有回滾接口、入?yún)ⅲ⒁獠⒉换貪L失敗值的接口,并根據(jù)順序倒序進(jìn)行接口回滾補(bǔ)償。

圖 4 回滾原理圖
3.3 執(zhí)行時(shí)序

圖 5 回滾執(zhí)行時(shí)序圖
3.4 回滾失敗處理方案:
事務(wù)服務(wù)的高可用保障:柔性事務(wù)前提是保證事務(wù)服務(wù)高可用性,重點(diǎn)保障;
回滾服務(wù)重試機(jī)制:回滾接口失敗重試機(jī)制,保證數(shù)據(jù)一致性;
為了避免架構(gòu)復(fù)雜度,做日志記錄、報(bào)警、人工處理。
4 注意問(wèn)題
回滾服務(wù)的冪等性:回滾做好業(yè)務(wù)防重和系統(tǒng)防重,防止因?yàn)榛貪L帶來(lái)的業(yè)務(wù)數(shù)據(jù)不一致;
臟數(shù)據(jù):整個(gè)事務(wù)中某一方法執(zhí)行失敗,前面調(diào)用方法的數(shù)據(jù)作為臟數(shù)據(jù)使用。簡(jiǎn)單的解決方案:依賴事務(wù)表整個(gè)事務(wù)執(zhí)行狀態(tài)來(lái)決定能否使用臟數(shù)據(jù)。但缺點(diǎn)就是這樣會(huì)耦合業(yè)務(wù)邏輯;
中心化:整個(gè)事務(wù)的維護(hù)完全依賴事務(wù)服務(wù)完成,需要保證事務(wù)服務(wù)的高可用性;
實(shí)時(shí)性:事務(wù)維護(hù)本方案通過(guò)定時(shí)任務(wù)維護(hù),如果業(yè)務(wù)場(chǎng)景有實(shí)時(shí)性要求,方式可以改為:在整個(gè)事務(wù)中某一方法執(zhí)行失敗時(shí),catch 異常,catch 內(nèi)更新任務(wù)狀態(tài)成功時(shí),直接進(jìn)行回滾邏輯調(diào)用。
5 總結(jié)
除了通過(guò)常規(guī)本地大事務(wù)保證事務(wù)完整性方案,本次方案提供了一套基于柔性事務(wù)回滾補(bǔ)償?shù)姆绞絹?lái)保證分布式事務(wù),通過(guò)維護(hù)事務(wù)服務(wù)和事務(wù)服務(wù)中心對(duì)應(yīng)數(shù)據(jù)表,從而保障整個(gè)分布式事務(wù)的完整性。實(shí)現(xiàn)方式簡(jiǎn)單、輕量、易于操作,方便地解決了常見(jiàn)分布式事務(wù)場(chǎng)景。
編輯:黃飛
?
電子發(fā)燒友App








評(píng)論