微服務架構下分布式事務方案

1 微服務的發(fā)展

微服務倡導將復雜的單體應用拆分為若干個功能簡單、松耦合的服務瘩将,這樣可以降低開發(fā)難度、增強擴展性凹耙、便于敏捷開發(fā)姿现。當前被越來越多的開發(fā)者推崇,很多互聯(lián)網(wǎng)行業(yè)巨頭使兔、開源社區(qū)等都開始了微服務的討論和實踐建钥。Hailo有160個不同服務構成,NetFlix有大約600個服務虐沥。國內方面熊经,阿里巴巴、騰訊欲险、360镐依、京東、58同城等很多互聯(lián)網(wǎng)公司都進行了微服務化實踐天试。當前微服務的開發(fā)框架也非常多槐壳,比較著名的有Dubbo、SpringCloud喜每、thrift 务唐、grpc等。

2 微服務落地存在的問題

雖然微服務現(xiàn)在如火如荼带兜,但對其實踐其實仍處于探索階段枫笛。很多中小型互聯(lián)網(wǎng)公司,鑒于經(jīng)驗刚照、技術實力等問題刑巧,微服務落地比較困難。如著名架構師Chris Richardson所言无畔,目前存在的主要困難有如下幾方面:

1)單體應用拆分為分布式系統(tǒng)后啊楚,進程間的通訊機制和故障處理措施變的更加復雜。

2)系統(tǒng)微服務化后浑彰,一個看似簡單的功能恭理,內部可能需要調用多個服務并操作多個數(shù)據(jù)庫實現(xiàn),服務調用的分布式事務問題變的非常突出郭变。

3)微服務數(shù)量眾多颜价,其測試薄风、部署、監(jiān)控等都變的更加困難拍嵌。

隨著RPC框架的成熟遭赂,第一個問題已經(jīng)逐漸得到解決。例如dubbo可以支持多種通訊協(xié)議横辆,springcloud可以非常好的支持restful調用撇他。對于第三個問題,隨著docker狈蚤、devops技術的發(fā)展以及各公有云paas平臺自動化運維工具的推出困肩,微服務的測試、部署與運維會變得越來越容易脆侮。

而對于第二個問題锌畸,現(xiàn)在還沒有通用方案很好的解決微服務產(chǎn)生的事務問題。分布式事務已經(jīng)成為微服務落地最大的阻礙靖避,也是最具挑戰(zhàn)性的一個技術難題潭枣。 為此,本文將深入和大家探討微服務架構下幻捏,分布式事務的各種解決方案盆犁,并重點為大家解讀阿里巴巴提出的分布式事務解決方案----GTS。該方案中提到的GTS是全新一代解決微服務問題的分布式事務互聯(lián)網(wǎng)中間件篡九。

3 傳統(tǒng)分布式事務解決方案

3.1 基于XA協(xié)議的兩階段提交方案

交易中間件與數(shù)據(jù)庫通過 XA 接口規(guī)范谐岁,使用兩階段提交來完成一個全局事務, XA 規(guī)范的基礎是兩階段提交協(xié)議榛臼。

第一階段是表決階段伊佃,所有參與者都將本事務能否成功的信息反饋發(fā)給協(xié)調者;第二階段是執(zhí)行階段沛善,協(xié)調者根據(jù)所有參與者的反饋航揉,通知所有參與者,步調一致地在所有分支上提交或者回滾路呜。

兩階段提交方案應用非常廣泛迷捧,幾乎所有商業(yè)OLTP數(shù)據(jù)庫都支持XA協(xié)議织咧。但是兩階段提交方案鎖定資源時間長胀葱,對性能影響很大,基本不適合解決微服務事務問題笙蒙。

3.2 TCC方案

TCC方案在電商抵屿、金融領域落地較多。TCC方案其實是兩階段提交的一種改進捅位。其將整個業(yè)務邏輯的每個分支顯式的分成了Try轧葛、Confirm搂抒、Cancel三個操作。Try部分完成業(yè)務的準備工作尿扯,confirm部分完成業(yè)務的提交求晶,cancel部分完成事務的回滾≈运瘢基本原理如下圖所示芳杏。

事務開始時,業(yè)務應用會向事務協(xié)調器注冊啟動事務辟宗。之后業(yè)務應用會調用所有服務的try接口爵赵,完成一階段準備。之后事務協(xié)調器會根據(jù)try接口返回情況泊脐,決定調用confirm接口或者cancel接口空幻。如果接口調用失敗,會進行重試容客。

TCC方案讓應用自己定義數(shù)據(jù)庫操作的粒度秕铛,使得降低鎖沖突、提高吞吐量成為可能缩挑。 當然TCC方案也有不足之處如捅,集中表現(xiàn)在以下兩個方面:

對應用的侵入性強。業(yè)務邏輯的每個分支都需要實現(xiàn)try调煎、confirm镜遣、cancel三個操作,應用侵入性較強士袄,改造成本高悲关。

實現(xiàn)難度較大。需要按照網(wǎng)絡狀態(tài)娄柳、系統(tǒng)故障等不同的失敗原因實現(xiàn)不同的回滾策略寓辱。為了滿足一致性的要求,confirm和cancel接口必須實現(xiàn)冪等赤拒。

上述原因導致TCC方案大多被研發(fā)實力較強秫筏、有迫切需求的大公司所采用。微服務倡導服務的輕量化挎挖、易部署这敬,而TCC方案中很多事務的處理邏輯需要應用自己編碼實現(xiàn),復雜且開發(fā)量大蕉朵。

3.3 基于消息的最終一致性方案

消息一致性方案是通過消息中間件保證上崔涂、下游應用數(shù)據(jù)操作的一致性∈夹疲基本思路是將本地操作和發(fā)送消息放在一個事務中冷蚂,保證本地操作和消息發(fā)送要么兩者都成功或者都失敗缭保。下游應用向消息系統(tǒng)訂閱該消息,收到消息后執(zhí)行相應操作蝙茶。

消息方案從本質上講是將分布式事務轉換為兩個本地事務艺骂,然后依靠下游業(yè)務的重試機制達到最終一致性÷『唬基于消息的最終一致性方案對應用侵入性也很高彻亲,應用需要進行大量業(yè)務改造,成本較高吮廉。

4 GTS--分布式事務解決方案

GTS是一款分布式事務中間件苞尝,由阿里巴巴中間件部門研發(fā),可以為微服務架構中的分布式事務提供一站式解決方案宦芦。

更多GTS資料請訪問研發(fā)團隊微博宙址。

4.1 GTS的核心優(yōu)勢

性能超強

GTS通過大量創(chuàng)新,解決了事務ACID特性與高性能调卑、高可用抡砂、低侵入不可兼得的問題。單事務分支的平均響應時間在2ms左右恬涧,3臺服務器組成的集群可以支撐3萬TPS以上的分布式事務請求注益。

應用侵入性極低

GTS對業(yè)務低侵入,業(yè)務代碼最少只需要添加一行注解(@TxcTransaction)聲明事務即可溯捆。業(yè)務與事務分離丑搔,將微服務從事務中解放出來,微服務關注于業(yè)務本身提揍,不再需要考慮反向接口啤月、冪等、回滾策略等復雜問題劳跃,極大降低了微服務開發(fā)的難度與工作量谎仲。

完整解決方案

GTS支持多種主流的服務框架,包括EDAS刨仑,Dubbo郑诺,Spring Cloud等。

有些情況下杉武,應用需要調用第三方系統(tǒng)的接口辙诞,而第三方系統(tǒng)沒有接入GTS。此時需要用到GTS的MT模式艺智。GTS的MT模式可以等價于TCC模式倘要,用戶可以根據(jù)自身業(yè)務需求自定義每個事務階段的具體行為圾亏。MT模式提供了更多的靈活性十拣,可能性封拧,以達到特殊場景下的自定義優(yōu)化及特殊功能的實現(xiàn)。

容錯能力強

GTS解決了XA事務協(xié)調器單點問題夭问,實現(xiàn)真正的高可用泽西,可以保證各種異常情況下的嚴格數(shù)據(jù)一致。

4.2 GTS的應用場景

GTS可應用在涉及服務調用的多個領域缰趋,包括但不限于金融支付捧杉、電信、電子商務秘血、快遞物流味抖、廣告營銷、社交灰粮、即時通信仔涩、手游、視頻粘舟、物聯(lián)網(wǎng)熔脂、車聯(lián)網(wǎng)等,詳細介紹可以閱讀 《GTS--阿里巴巴分布式事務全新解決方案》一文柑肴。

4.3 GTS與微服務的集成

GTS包括客戶端(GTS Client)霞揉、資源管理器(GTS RM)和事務協(xié)調器(GTS Server)三個部分。GTS Client主要用來界定事務邊界晰骑,完成事務的發(fā)起與結束适秩。GTS RM完成事務分支的創(chuàng)建、提交硕舆、回滾等操作隶症。GTS Server主要負責分布式事務的整體推進,事務生命周期的管理岗宣。GTS和微服務集成的結構圖如下所示蚂会,GTS Client需要和業(yè)務應用集成部署,RM與微服務集成部署胁住。

4.4 GTS的輸出形式

GTS目前有三種輸出形式:公有云輸出刊咳、公網(wǎng)輸出、專有云輸出娱挨。

4.4.1 公有云輸出

這種輸出形式面向阿里云用戶余指。如果用戶的業(yè)務系統(tǒng)已經(jīng)部署到阿里云上,可以申請開通公有云GTS酵镜。開通后業(yè)務應用即可通過GTS保證服務調用的一致性。這種使用場景下淮韭,業(yè)務系統(tǒng)和GTS間的網(wǎng)絡環(huán)境比較理想垢粮,達到很好性能。

4.4.2 公網(wǎng)輸出

這種輸出形式面向于非阿里云的用戶靠粪,使用更加方便、靈活昔善,業(yè)務系統(tǒng)只要能連接互聯(lián)網(wǎng)即可享受GTS提供的云服務(與公有云輸出的差別在于客戶端部署于用戶本地畔乙,而不在云上)。

在正常網(wǎng)絡環(huán)境下袖订,以包含兩個本地事務的全局事務為例嗅虏,事務完成時間在20ms左右,50個并發(fā)就可以輕松實現(xiàn)1000TPS以上分布式事務皮服,對絕大多數(shù)業(yè)務來說性能是足夠的龄广。在公網(wǎng)環(huán)境,網(wǎng)絡閃斷很難完全避免择同,這種情況下GTS仍能保證服務調用的數(shù)據(jù)一致性。

具體使用樣例使用參見4.7節(jié)GTS的工程樣例裹纳。

4.4.3 專有云輸出

這種形式主要面向于已建設了自己專有云平臺的大用戶剃氧,GTS可以直接部署到用戶的專有云上阻星,為專有云提供分布式事務服務。目前已經(jīng)有10多個特大型企業(yè)的專有云使用GTS解決分布式事務難題滥酥,性能與穩(wěn)定性經(jīng)過了用戶的嚴格檢測。

4.5 GTS的使用方式

GTS對應用的侵入性非常低恨狈,使用也很簡單呛讲。下面以訂單存儲應用為例說明。訂單業(yè)務應用通過調用訂單服務和庫存服務完成訂單業(yè)務贝搁,服務開發(fā)框架為Dubbo。

4.5.1 訂單業(yè)務應用

在業(yè)務函數(shù)外圍使用@TxcTransaction注解即可開啟分布式事務弦讽。Dubbo應用通過隱藏參數(shù)將GTS的事務xid傳播到服務端膀哲。

4.5.2 服務提供者

更新庫存方法

4.6 GTS的應用情況

GTS目前已經(jīng)在淘寶某宪、天貓、阿里影業(yè)蔼囊、淘票票衣迷、阿里媽媽、1688等阿里各業(yè)務系統(tǒng)廣泛使用云矫,經(jīng)受了16年和17年兩年雙十一海量請求的考驗汗菜。某線上業(yè)務系統(tǒng)最高流量已達十萬TPS(每秒鐘10萬筆事務)。

GTS在公有云和專有云輸出后堆缘,已經(jīng)有了100多個線上用戶普碎,很多用戶通過GTS解決SpringCloud留瞳、Dubbo、Edas等服務框架的分布式事務問題。業(yè)務領域涉及電力乐横、物流钮莲、ETC、煙草极舔、金融链瓦、零售、電商渤刃、共享出行等十幾個行業(yè)贴膘,得到用戶的一致認可。

![](https://img.alicdn.com/tfs/TB1QpqNdFGWBuNjy0FbXXb4sXXa-1530-1140.png)

上圖是GTS與SpringCloud集成揪胃,應用于某共享出行系統(tǒng)氛琢。業(yè)務共享出行場景下,通過GTS支撐物聯(lián)網(wǎng)系統(tǒng)骚勘、訂單系統(tǒng)撮奏、支付系統(tǒng)、運維系統(tǒng)泽疆、分析系統(tǒng)等系各統(tǒng)應用的數(shù)據(jù)一致性玲献,保證海量訂單和數(shù)千萬流水的交易梯浪。

4.7 GTS的工程樣例

GTS的公有云樣例可參考阿里云網(wǎng)站挂洛。在公網(wǎng)環(huán)境下提供sample-txc-simple和sample-txc-dubbo兩個樣例工程眠砾。

4.7.1 sample-txc-simple樣例

4.7.1.1 樣例業(yè)務邏輯

該樣例是GTS的入門sample,案例的業(yè)務邏輯是從A賬戶轉賬給B賬戶柒巫,其中A和B分別位于兩個MySQL數(shù)據(jù)庫中哈肖,使用GTS事務保證A和B賬戶錢的總數(shù)始終不變念秧。

4.7.1.2 樣例搭建方法

1) 準備數(shù)據(jù)庫環(huán)境

安裝MySQL,創(chuàng)建兩個數(shù)據(jù)庫db1和db2币狠。在db1和db2中分別創(chuàng)建txc_undo_log表(SQL腳本見4.7.3)砾层。在db1庫中創(chuàng)建user_money_a表肛炮,在db2庫中創(chuàng)建user_money_b表。

2) 下載樣例

將sample-txc-simple文件下載到本地碍扔,樣例中已經(jīng)包含了GTS的SDK秕重。

3) 修改配置

打開sample-txc-simple/src/main/resources目錄下的txc-client-context.xml,將數(shù)據(jù)源的url二拐、username凳兵、password修改為實際值。

4) 運行樣例

在sample-txc-simple目錄下執(zhí)行build.sh編譯本工程饭望。編譯完成后執(zhí)行run.sh。

4.7.2 sample-txc-dubbo 樣例

4.7.2.1 樣例業(yè)務邏輯

本案例模擬了用戶下訂單藻治、減庫存的業(yè)務邏輯巷挥。客戶端(Client)通過調用訂單服務(OrderService)創(chuàng)建訂單雏节,之后通過調用庫存服務(StockService)扣庫存高职。其中訂單服務讀寫訂單數(shù)據(jù)庫怔锌,庫存服務讀寫庫存數(shù)據(jù)庫。由 GTS 保證跨服務事務的一致性埃元。

4.7.2.2 樣例搭建方法

1) 準備數(shù)據(jù)庫環(huán)境

安裝MySQL岛杀,創(chuàng)建兩個數(shù)據(jù)庫db1和db2。在db1和db2中分別創(chuàng)建txc_undo_log表糊肠。在db1庫中創(chuàng)建orders表遗锣,在db2庫中創(chuàng)建stock表。

2) 下載樣例

將樣例文件sample-txc-dubbo下載到本地機器泪酱,樣例中已經(jīng)包含了GTS的SDK还最。

3) 修改配置

打開sample-txc-dubbo/src/main/resources目錄拓轻,將dubbo-order-service.xml、dubbo-stock-service.xml兩個文件中數(shù)據(jù)源的url勿锅、username、password修改為實際值溢十。

4) 運行樣例

編譯程序

在工程根目錄執(zhí)行 build.sh 命令张弛,編譯工程。編譯后會在 sample-txc-dubbo/client/bin 目錄下生成 order_run.sh寺董、stock_run.sh刻剥、client_run.sh 三個運行腳本對應訂單服務、庫存服務以及客戶端御吞。

運行程序

在根目錄執(zhí)行run.sh酗电,該腳本會依次啟動order_run.sh(訂單服務)内列、stock_run.sh(庫存服務)和client_run.sh(客戶端程序)话瞧。

4.7.2.3 其他說明

樣例使用Multicast注冊中心的聲明方式。如果本機使用無線網(wǎng)絡划滋,dubbo服務在綁定地址時有可能獲取ipv6地址埃篓,可以通過jvm啟動參數(shù)禁用。

方法是配置jvm啟動參數(shù)?-Djava.net.preferIPv4Stack=true同窘。

4.7.3 SQL

4.7.3.1 建表 txc_undo_log

CREATE TABLE txc_undo_log (

id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主鍵',

gmt_create datetime NOT NULL COMMENT '創(chuàng)建時間',

gmt_modified datetime NOT NULL COMMENT '修改時間',

xid varchar(100) NOT NULL COMMENT '全局事務ID',

branch_id bigint(20) NOT NULL COMMENT '分支事務ID',

rollback_info longblob NOT NULL COMMENT 'LOG',

status int(11) NOT NULL COMMENT '狀態(tài)',

server varchar(32) NOT NULL COMMENT '分支所在DB IP',

PRIMARY KEY (id),

KEY?unionkey(xid,branch_id)

) ENGINE=InnoDB AUTO_INCREMENT=211225994 DEFAULT CHARSET=utf8 COMMENT='事務日志表';

4.7.3.2 建表 user_money_a

CREATE TABLE user_money_a(

id int(11) NOT NULL AUTO_INCREMENT,

money int(11) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

4.7.3.3 建表 user_money_b

CREATE TABLE user_money_b (

id int(11) NOT NULL AUTO_INCREMENT,

money int(11) DEFAULT NULL,

PRIMARY KEY (id)

) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

4.7.3.4 建表 orders

CREATE TABLE orders (

id bigint(20) NOT NULL AUTO_INCREMENT,

user_id varchar(255) NOT NULL,

product_id int(11) NOT NULL,

number int(11) NOT NULL,

gmt_create timestamp NOT NULL,

PRIMARY KEY (id)

) ENGINE=MyISAM AUTO_INCREMENT=351 DEFAULT CHARSET=utf8

4.7.3.5 建表 stock

CREATE TABLE stock(

product_id?int(11) NOT NULL,

price float NOT NULL,

amount int(11) NOT NULL,

PRIMARY KEY (product_id)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

想要了解更多分布式知識點的想邦,可以關注我一下丧没,我后續(xù)也會整理更多關于分布式架構這一塊的知識點分享出來,另外順便給大家推薦一個交流學習群:650385180漆际,里面會分享一些資深架構師錄制的視頻錄像:有Spring夺饲,MyBatis,Netty源碼分析茫蛹,高并發(fā)烁挟、高性能撼嗓、分布式、微服務架構的原理且警,JVM性能優(yōu)化這些成為架構師必備的知識體系斑芜。還能領取免費的學習資源,目前受益良多盈包,以下的課程體系圖也是在群里獲取醇王。

5 總結

GTS已經(jīng)在阿里內部廣泛使用寓娩,經(jīng)過了雙十一流量高峰的考驗。內部成熟后寞埠,在專有云和公有云服務了很多用戶排嫌,很多用戶一天事務量在千萬/億級別,解決了業(yè)務服務化改造后的分布式事務棘手技術難題怖糊。

在整個世界范圍內,既滿足事務ACID特性并徘,又具備高性能扰魂、高可用劝评、業(yè)務侵入性低的分布式事務中間件在GTS前是不存在的。讓我們一起體驗GTS帶來的巨大變革吧蒋畜!

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末姻成,一起剝皮案震驚了整個濱河市科展,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徘跪,老刑警劉巖砂竖,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乎澄,死亡現(xiàn)場離奇詭異测摔,居然都是意外死亡,警方通過查閱死者的電腦和手機浙于,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進店門羞酗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來紊服,“玉大人胸竞,你說我怎么就攤上這事卫枝《锟妫” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵马篮,是天一觀的道長积蔚。 經(jīng)常有香客問我烦周,道長,這世上最難降的妖魔是什么漱贱? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任幅狮,我火速辦了婚禮株灸,結果婚禮上,老公的妹妹穿的比我還像新娘逐抑。我一直安慰自己屹蚊,他們只是感情好汹粤,可當我...
    茶點故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著国葬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪接奈。 梳的紋絲不亂的頭發(fā)上船殉,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天利虫,我揣著相機與錄音,去河邊找鬼疫剃。 笑死硼讽,一個胖子當著我的面吹牛固阁,可吹牛的內容都是我干的。 我是一名探鬼主播碉克,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼并齐,長吁一口氣:“原來是場噩夢啊……” “哼况褪!你這毒婦竟也來了?” 一聲冷哼從身側響起捏膨,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤脊奋,失蹤者是張志新(化名)和其女友劉穎疙描,沒想到半個月后讶隐,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡地消,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年脉执,在試婚紗的時候發(fā)現(xiàn)自己被綠了戒劫。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,569評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡巫橄,死狀恐怖湘换,靈堂內的尸體忽然破棺而出统阿,到底是詐尸還是另有隱情,我是刑警寧澤帆离,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布盯质,位于F島的核電站概而,受9級特大地震影響,放射性物質發(fā)生泄漏王悍。R本人自食惡果不足惜餐曼,卻給世界環(huán)境...
    茶點故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一源譬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧刮刑,春花似錦、人聲如沸泛烙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至坊饶,卻和暖如春殴蓬,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痘绎。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留肖粮,地道東北人孤页。 一個月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像涩馆,于是被迫代替她去往敵國和親行施。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,446評論 2 348

推薦閱讀更多精彩內容