關(guān)于開源分布式事務(wù)中間件Fescar,我們總結(jié)了開發(fā)者關(guān)心的13個(gè)問題
© Mikito Tateisi
開源分布式事務(wù)中間件 Fescar 自1月10日上線v0.1版本以來,受到了開發(fā)者們的極大關(guān)注(watch249,star3005,fork649,社區(qū)討論的issue58,數(shù)據(jù)統(tǒng)計(jì)于1月17日14:00),可見,天下苦分布式事務(wù)久矣。
為此,我們收集了大家在社區(qū)(Github)和社群關(guān)注的核心問題,總結(jié)如下,并給出回復(fù)。
Q1:Fescar 的發(fā)展經(jīng)歷了哪些歷程?和阿里云全局事務(wù)服務(wù)GTS之間是什么關(guān)系?
A1:阿里巴巴是國內(nèi)最早一批進(jìn)行應(yīng)用分布式(微服務(wù)化)改造的企業(yè),所以很早就遇到微服務(wù)架構(gòu)下的分布式事務(wù)問題。
- 2014 年
阿里巴巴中間件團(tuán)隊(duì)發(fā)布TXC(Taobao Transaction Constructor),為集團(tuán)內(nèi)應(yīng)用提供分布式事務(wù)服務(wù)。
- 2016 年
TXC 經(jīng)過產(chǎn)品化改造,以GTS(Global TransactionService)的身份上線阿里云,成為當(dāng)時(shí)業(yè)界唯一一款云上分布式事務(wù)產(chǎn)品,以阿里云公有云或?qū)S性平鉀Q方案的形式,交付給眾多外部客戶。
- 2019 年
基于 TXC 和 GTS 的技術(shù)積累,阿里巴巴中間件團(tuán)隊(duì)發(fā)起了開源項(xiàng)目Fescar(Fast & EaSy Commit And Rollback, FESCAR),和社區(qū)一起建設(shè)這個(gè)分布式事務(wù)解決方案。
TXC/GTS/Fescar一脈相承,為解決微服務(wù)架構(gòu)下的分布式事務(wù)問題交出了一份與眾不同的答卷。
Q2:Fescar 有哪些適用場景?
A2:Fescar 的愿景是讓分布式事務(wù)的使用像現(xiàn)在本地事務(wù)的使用一樣簡單、高效,最終的目標(biāo)是希望可以適用于所有的分布式事務(wù)場景。目前,核心的 AT 模式適用于構(gòu)建于支持本地 ACID 事務(wù)的關(guān)系型數(shù)據(jù)庫。非關(guān)系型數(shù)據(jù)庫類資源的管理,通過 MT 模式來支持。AT 模式與 MT 模式完全兼容,所以可以在同一個(gè)分布式事務(wù)中,同時(shí)管理兩類資源。
Q3:目前有已經(jīng)有一些其他的分布式事務(wù)開源方案,F(xiàn)escar 和他們之間有哪些區(qū)別?和JTA支持分布式事務(wù)有哪些區(qū)別?
A3:既有的分布式事務(wù)解決方案按照對(duì)業(yè)務(wù)侵入性分為兩類,即:對(duì)業(yè)務(wù)無侵入的和對(duì)業(yè)務(wù)有侵入的。
- 業(yè)務(wù)無侵入的方案
既有的主流分布式事務(wù)解決方案中,對(duì)業(yè)務(wù)無侵入的只有基于 XA 的方案(注:問題中提到的 JTA 是XA 方案的 Java 版本),但應(yīng)用XA 方案存在 3 個(gè)方面的問題:
1、要求數(shù)據(jù)庫提供對(duì) XA 的支持。如果遇到不支持 XA(或支持得不好,比如 MySQL 5.7 以前的版本)的數(shù)據(jù)庫,則不能使用。
2、受協(xié)議本身的約束,事務(wù)資源(數(shù)據(jù)記錄、數(shù)據(jù)庫連接)的鎖定周期長。長周期的資源鎖定從業(yè)務(wù)層面來看,往往是不必要的,而因?yàn)槭聞?wù)資源的管理器是數(shù)據(jù)庫本身,應(yīng)用層無法插手。這樣形成的局面就是,基于 XA 的應(yīng)用往往性能會(huì)比較差,而且很難優(yōu)化。
3、已經(jīng)落地的基于 XA 的分布式解決方案,都依托于重量級(jí)的應(yīng)用服務(wù)器(Tuxedo/WebLogic/WebSphere 等),這是不適用于微服務(wù)架構(gòu)的。
- 侵入業(yè)務(wù)的方案
實(shí)際上,最初分布式事務(wù)只有 XA 這個(gè)唯一方案。XA 是完備的,但在實(shí)踐過程中,由于種種原因(包含但不限于上面提到的3 點(diǎn))往往不得不放棄,轉(zhuǎn)而從業(yè)務(wù)層面著手來解決分布式事務(wù)問題。比如:
- 基于可靠消息的最終一致性方案
- TCC
- Saga
都屬于這一類。這些方案的具體機(jī)制在這里不做展開,網(wǎng)上這方面的論述文章非常多??傊?,這些方案都要求在應(yīng)用的業(yè)務(wù)層面把分布式事務(wù)技術(shù)約束考慮到設(shè)計(jì)中,通常每一個(gè)服務(wù)都需要設(shè)計(jì)實(shí)現(xiàn)正向和反向的冪等接口。這樣的設(shè)計(jì)約束,往往會(huì)導(dǎo)致很高的研發(fā)和維護(hù)成本。
不可否認(rèn),侵入業(yè)務(wù)的分布式事務(wù)方案都經(jīng)過大量實(shí)踐驗(yàn)證,能有效解決問題,在各行種業(yè)的業(yè)務(wù)應(yīng)用系統(tǒng)中起著重要作用。但回到原點(diǎn)來思考,這些方案的采用實(shí)際上都是迫于無奈。
回到問題:
與基于消息的最終一致、TCC、Saga等業(yè)務(wù)邏輯侵入方案的不同在于,F(xiàn)escar 的設(shè)計(jì)初衷就是保持對(duì)業(yè)務(wù)的非侵入性,不要求業(yè)務(wù)層面按照分布式事務(wù)的特定場景來設(shè)計(jì)正向和反向的兩套(甚至多套)業(yè)務(wù)邏輯。這方面的差別就不展開了。
與 XA 的區(qū)別在于,設(shè)計(jì)了一套不同與 XA 的兩階段協(xié)議,在保持對(duì)業(yè)務(wù)不侵入的前提下,保證良好的性能,也避免了對(duì)底層數(shù)據(jù)庫協(xié)議支持的要求??梢钥醋魇且惶纵p量級(jí)的XA 機(jī)制。具體的差別如下:
XA方案的 RM 實(shí)際上是在數(shù)據(jù)庫層,RM本質(zhì)上就是數(shù)據(jù)庫自身(通過提供支持 XA 的驅(qū)動(dòng)程序來供應(yīng)用使用)。
而 Fescar 的RM 是以二方包的形式作為中間件層部署在應(yīng)用程序這一側(cè)的,不依賴與數(shù)據(jù)庫本身對(duì)協(xié)議的支持,當(dāng)然也不需要數(shù)據(jù)庫支持XA 協(xié)議。這點(diǎn)對(duì)于微服務(wù)化的架構(gòu)來說是非常重要的:應(yīng)用層不需要為本地事務(wù)和分布式事務(wù)兩類不同場景來適配兩套不同的數(shù)據(jù)庫驅(qū)動(dòng)。
這個(gè)設(shè)計(jì),剝離了分布式事務(wù)方案對(duì)數(shù)據(jù)庫在協(xié)議支持上的要求。
- 兩階段提交
先來看一下 XA 的2PC 過程。
無論 Phase2 的決議是commit 還是 rollback,事務(wù)性資源的鎖都要保持到Phase2 完成才釋放。
再看 Fescar 的2PC 過程。
分支事務(wù)中數(shù)據(jù)的 本地鎖 由本地事務(wù)管理,在分支事務(wù) Phase1 結(jié)束時(shí)釋放。
同時(shí),隨著本地事務(wù)結(jié)束,連接 也得以釋放。
分支事務(wù)中數(shù)據(jù)的 全局鎖 在事務(wù)協(xié)調(diào)器側(cè)管理,在決議 Phase2 全局提交時(shí),全局鎖馬上可以釋放。只有在決議全局回滾的情況下,全局鎖 才被持有至分支的 Phase2 結(jié)束。
這個(gè)設(shè)計(jì),極大地減少了分支事務(wù)對(duì)資源(數(shù)據(jù)和連接)的鎖定時(shí)間,給整體并發(fā)和吞吐的提升提供了基礎(chǔ)。
Q4:Fescar 支持 Dubbo 的哪些版本?
A4:所有版本。
Q5:Fescar 支持 Spring Cloud么?
A5:Fescar 與微服務(wù)框架的接口點(diǎn)在于,需要把事務(wù)的唯一標(biāo)識(shí) XID(一個(gè)字符串)通過微服務(wù)框架的服務(wù)調(diào)用間調(diào)用的機(jī)制中,透明地傳遞,并通過 Fescar 的 API 來綁定(或解綁)到應(yīng)用的線程上下文中。(機(jī)制可以參考內(nèi)置的對(duì) Dubbo 支持的實(shí)現(xiàn)com.alibaba.fescar.dubbo.TransactionPropagationFilter)所以,本質(zhì)上這個(gè)問題不是支不支持Spring Cloud,而是如何支持 Spring Cloud 中選用的服務(wù)調(diào)用機(jī)制。目前正在和 Spring Cloud Alibaba 的同學(xué)合作,準(zhǔn)備在v0.5.x版本(或更早)發(fā)布對(duì) Spring Cloud默認(rèn)的支持。同時(shí),非常歡迎社區(qū)的朋友參與進(jìn)來,貢獻(xiàn)包括 Spring Cloud 在內(nèi)的各類微服務(wù)框架的支持。
Q6:Fescar 是否支持本地跨庫多數(shù)據(jù)源?除了關(guān)系型數(shù)據(jù)庫,是否還支持NoSQL數(shù)據(jù)庫?
A6:本地跨多數(shù)據(jù)源同樣是支持的,在 Fescar 的架構(gòu)中,同一個(gè)服務(wù)中的多個(gè)數(shù)據(jù)源與跨服務(wù)的多個(gè)數(shù)據(jù)源,沒有本質(zhì)區(qū)別。AT 模式目前僅限于對(duì)關(guān)系型數(shù)據(jù)庫的支持(本身具備ACID 事務(wù)支持),后面會(huì)發(fā)布出來的 MT 模式可以支持 NoSQL 這類本身不具備本地事務(wù)支持的資源。
Q7:Fescar 現(xiàn)在開源的是AT模式,MT模式暫時(shí)不支持,什么時(shí)候會(huì)開源?
A7:當(dāng)前 0.1.0 版本只是把 Fescar 最核心的 AT 模式的最小集發(fā)布出來,一方面是按開源的規(guī)劃和架構(gòu)的重構(gòu)進(jìn)展,另一方面也是希望通過最小集版本,讓用戶和開發(fā)者社區(qū)更容易理解到我們核心的設(shè)計(jì)思路,讓更多人比較容易地參與進(jìn)來建設(shè),而不是完全由阿里巴巴主導(dǎo),僅僅把我們的整套方案開源出來給大家用而已。阿里巴巴在分布式事務(wù)上的技術(shù)積累,我們會(huì)通過 Fescar 項(xiàng)目毫無保留地貢獻(xiàn)給社區(qū),所有功能特性都會(huì)按規(guī)劃和社區(qū)的反饋陸續(xù)開源出來。MT 按初步的計(jì)劃,會(huì)在0.5.x 版本發(fā)布。
Q8:Fescar 什么時(shí)候提供HA cluster,單節(jié)點(diǎn)的server的瓶頸如何處理?
A8:按初步的計(jì)劃,HA Cluster 會(huì)在 0.5.x 版本發(fā)布,解決單機(jī)部署的單點(diǎn)問題。
Q9:因網(wǎng)絡(luò)中斷、網(wǎng)張閃斷、節(jié)點(diǎn)宕機(jī)和超時(shí)等引起的異常,F(xiàn)escar會(huì)提供相應(yīng)的補(bǔ)償措施么?
A9:這些異常情況的處理是分布式事務(wù)解決方案的基本要求,F(xiàn)escar 同樣也是提供了整套方案來處理各類異常場景。這方面的具體機(jī)制會(huì)在 HA Cluster 版本發(fā)布時(shí),給出全面的分析介紹。
Q10:Fescar框架中,如何監(jiān)控分布式事務(wù)?
A10:監(jiān)控是非常重要的一塊兒內(nèi)容。TXC 和 GTS 的監(jiān)控在阿里巴巴內(nèi)部使用了很多基礎(chǔ)設(shè)施的輔助。而在開源版本中,我們還沒有一個(gè)現(xiàn)成的監(jiān)控方案。大體上,監(jiān)控的基礎(chǔ)是兩個(gè)方面:一方面是日志,通過日志的采集和處理,可以形成一個(gè)完整的事務(wù)鏈路,這些數(shù)據(jù)對(duì)于業(yè)務(wù)層面的分析和調(diào)優(yōu)是重要的參考依據(jù)。另一方面是 API,F(xiàn)escar 會(huì)提供一套管控 API,用于對(duì)運(yùn)行時(shí)事務(wù)的管理。我們后續(xù)會(huì)把這兩方面的數(shù)據(jù)格式、部署形態(tài)及接口整理出來,希望和社區(qū)來共建監(jiān)控這個(gè)重要的方面。
Q11:Fescar 的roadmap 有了么?
A11:目前最新的roadmap如下:
v0.1.0
- 微服務(wù)框架支持: Dubbo
- 數(shù)據(jù)庫支持: MySQL
- 基于 Spring AOP 的 Annotation
- 事務(wù)協(xié)調(diào)器: 單機(jī)版本
v0.5.x
- 微服務(wù)框架支持: Spring Cloud
- MT 模式
- 支持 TCC 模式事務(wù)的適配
- 動(dòng)態(tài)配置和服務(wù)發(fā)現(xiàn)
- 事務(wù)協(xié)調(diào)器: 高可用集群版本
v0.8.x
- Metrics
- 控制臺(tái): 監(jiān)控/部署/升級(jí)/擴(kuò)縮容
v1.0.0
- General Availability: 生產(chǎn)環(huán)境適用
v1.5.x
- 數(shù)據(jù)庫支持: Oracle/PostgreSQL/OceanBase
- 不依賴 Spring AOP 的 Annotation
- 熱點(diǎn)數(shù)據(jù)的優(yōu)化處理機(jī)制
- RocketMQ 事務(wù)消息納入全局事務(wù)管理
- NoSQL 納入全局事務(wù)管理的適配機(jī)制
- 支持 HBase
- 支持 Redis
v2.0.0
- 支持 XA
當(dāng)然,項(xiàng)目迭代演進(jìn)的過程,我們最重視的是社區(qū)的聲音,路線圖會(huì)和社區(qū)充分交流及時(shí)進(jìn)行調(diào)整。
Q12:Fescar 官網(wǎng)什么時(shí)候上線?
A12:Fescar 官方域名已經(jīng)注冊,官網(wǎng)將采用靜態(tài)開源站點(diǎn)搭建工具Docsite「傳送門」進(jìn)行搭建,logo 已經(jīng)設(shè)計(jì)并將于近期公布。
Q13:如何加入 Fescar 社區(qū),進(jìn)行貢獻(xiàn),已經(jīng)摩拳擦掌了。
A13:我們非常歡迎大家通過各種形式參與到我們項(xiàng)目的建設(shè)中,包括但不限于:
- 架構(gòu)設(shè)計(jì)
- 模塊設(shè)計(jì)
- 代碼實(shí)現(xiàn)
- Bug Fix
- Demo樣例
- 文檔、網(wǎng)站和翻譯
具體的參與方法可以參見我們項(xiàng)目中的CONTRIBUTING 指引,或與 @eternaltingting@163.com聯(lián)系。實(shí)際上,我們并不拘泥于貢獻(xiàn)的形式,開發(fā)者提出的每一個(gè) issue,無論是Bug Report、改進(jìn)建議或者甚至是問題咨詢都代表著對(duì)項(xiàng)目的關(guān)注和幫助。希望 Fescar 項(xiàng)目和社區(qū)一起健康成長,成為分布式事務(wù)領(lǐng)域一個(gè)優(yōu)秀的解決方案。
本文作者:煊檍,社區(qū)昵稱sharajava,F(xiàn)escar 開源項(xiàng)目發(fā)起人,阿里巴巴中件間 TXC/GTS 研發(fā)團(tuán)隊(duì)負(fù)責(zé)人,曾多年從事 WebLogic 核心研發(fā)工作,長期專注于中間件,在分布式事務(wù)領(lǐng)域的技術(shù)實(shí)踐較豐富。