知其然,知其所以然!
- Fescar源碼閱讀-解決分布式事務(wù)的利器
- Fescar源碼閱讀-RPC和消息
- Fescar源碼閱讀-全自動(dòng)的分布式事務(wù)AT
- Fescar源碼閱讀-神奇的UndoLog(一)
目前分布式系統(tǒng)架構(gòu)越來越流行,隨之而來的分布式事務(wù)問題也越發(fā)凸顯,但是對于這一難題,一直沒有很好的解決方案,無論是基于消息的最終一致性、還是TCC模式都有相應(yīng)的局限性和技術(shù)復(fù)雜度,都不能稱為最佳方案。
阿里鼎鼎大名的GTS一直以來都被譽(yù)為解決分布式事務(wù)的利器,但是苦于其沒有開源,對于大批碼農(nóng)來說GTS一直蒙著一層神秘面紗,到底它有著怎樣的黑科技呢,好想知道。。。
出乎意料的是,2019年剛開始,阿里重磅開源了和GTS一脈相承的Fescar(這里確實(shí)要為阿里的開源精神點(diǎn)36個(gè)贊?。?,終于讓我們能有有機(jī)會(huì)近距離接觸Fescar。
了解Fescar,從源碼開始!
本文作為開篇,作為閱讀Fescar源碼后的收獲所得,權(quán)做筆記。
理解一個(gè)項(xiàng)目最快的方式是閱讀它的官方文檔,F(xiàn)escar的官方文檔目前還不是很完善,但是它的概述部分寫的非常清晰明了,可以很快速的幫助我們理解整個(gè)產(chǎn)品的架構(gòu)。
傳送門:Fescar Guide
模塊
Fescar項(xiàng)目的模塊劃分如下圖(源碼日期:2019-01-30):

- common
喜聞樂見的common - config
封裝了系統(tǒng)配置的加載、獲取、更新,如線程池的配置、commit緩沖區(qū)的配置等 - core
核心模塊,定義了核心接口,包含系統(tǒng)交互模塊、定義了各種報(bào)文結(jié)構(gòu)、定義了消息的發(fā)送、接收、處理的核心接口 - server
TC的核心實(shí)現(xiàn) - rm-datasource
關(guān)系型數(shù)據(jù)庫RM的核心實(shí)現(xiàn)(Mysql) - tm
TM的核心實(shí)現(xiàn) - spring、dubbo
針對Spring和dubbo項(xiàng)目的接入適配層
TM、RM、TC

這張官方的圖簡單明了,展示了Fescar的三個(gè)核心概念模型:
- Transaction Coordinator (TC): 事務(wù)協(xié)調(diào)器,維護(hù)全局事務(wù)的運(yùn)行狀態(tài),負(fù)責(zé)協(xié)調(diào)并驅(qū)動(dòng)全局事務(wù)的提交或回滾。
- Transaction Manager (TM): 控制全局事務(wù)的邊界,負(fù)責(zé)開啟一個(gè)全局事務(wù),并最終發(fā)起全局提交或全局回滾的決議。
- Resource Manager (RM): 控制分支事務(wù),負(fù)責(zé)分支注冊、狀態(tài)匯報(bào),并接收事務(wù)協(xié)調(diào)器的指令,驅(qū)動(dòng)分支(本地)事務(wù)的提交和回滾。
看看相關(guān)接口:
// 負(fù)責(zé)開啟、提交、回滾全局事務(wù)
public interface TransactionManager {
// 開啟全局事務(wù)
String begin(String applicationId, String transactionServiceGroup, String name, int timeout) throws TransactionException;
// 提交
GlobalStatus commit(String xid) throws TransactionException;
//回滾
GlobalStatus rollback(String xid) throws TransactionException;
//獲取事務(wù)狀態(tài)
GlobalStatus getStatus(String xid) throws TransactionException;
}
/**
* 本地事務(wù)資源管理,管理本地事務(wù)的注冊、報(bào)告,參與全局事務(wù)的提交回滾等
*/
public interface ResourceManager extends ResourceManagerInbound, ResourceManagerOutbound{
//注冊事務(wù)資源
void registerResource(Resource resource);
//注銷事務(wù)資源
void unregisterResource(Resource resource);
//獲取被當(dāng)前RM管理的資源
Map<String, Resource> getManagedResources();
}
public interface ResourceManagerInbound {
//提交事務(wù)branch
BranchStatus branchCommit(String xid, long branchId, String resourceId, String applicationData) throws TransactionException;
//回滾事務(wù)branch
BranchStatus branchRollback(String xid, long branchId, String resourceId, String applicationData) throws TransactionException;
}
public interface ResourceManagerOutbound {
// 注冊事務(wù)branch
Long branchRegister(BranchType branchType, String resourceId, String clientId, String xid, String lockKeys) throws
TransactionException;
//報(bào)告事務(wù)branch狀態(tài)
void branchReport(String xid, long branchId, BranchStatus status, String applicationData) throws TransactionException;
// 查詢鎖
boolean lockQuery(BranchType branchType, String resourceId, String xid, String lockKeys) throws TransactionException;
}
/**
* 被RM管理的資源,可加入全局事務(wù)
*/
public interface Resource {
String getResourceGroupId();
String getResourceId();
}
接口定義的很清楚,看名字就知道是什么作用了。
看完之后可能會(huì)有點(diǎn)奇怪,TM、RM都有核心接口、為什么沒有TC的接口呢?
其實(shí)TC和(TM+RM)是分別作為服務(wù)端和客戶端,他們實(shí)現(xiàn)的接口其實(shí)是一致的,只不過行為相反,同樣一個(gè)接口,對于TM是出站的,則對于TC是入站;如果對于TM是入站則對于TC是出站;從而最終形成完整閉環(huán)。
比如TransactionManager#begin接口
- 對于TM來說,作為客戶端,在此接口中發(fā)送開啟全局事務(wù)的請求到TC,并接受TC的返回;
- 對于TC來說,作為服務(wù)端,在此接口中實(shí)現(xiàn)對全局事務(wù)Session的生成和存儲(chǔ),并返回XID給TM;
對于TM,RM的層次和責(zé)任劃分,稍加整理,如下圖:

官方提供的流程圖,TM、RM和TC如何協(xié)作分工;

先整理一下目前官方提供的實(shí)現(xiàn):
- TM:
com.alibaba.fescar.tm.DefaultTransactionManager,實(shí)現(xiàn)了全局事務(wù)的開始、提交和回滾等。 - RM:
com.alibaba.fescar.rm.datasource.DataSourceManager,實(shí)現(xiàn)了對MYSQL數(shù)據(jù)庫事務(wù)的資源管理; - Resource:
com.alibaba.fescar.rm.datasource.DataSourceProxy,實(shí)現(xiàn)對MYSQL數(shù)據(jù)庫代理。 - TC:
com.alibaba.fescar.server.coordinator.DefaultCore+com.alibaba.fescar.server.coordinator.DefaultCoordinator
DefaultCore實(shí)現(xiàn)了TransactionManager和ResourceManagerOutbound
DefaultCoordinator實(shí)現(xiàn)了ResourceManagerInbound
作為分布式系統(tǒng),TM、RM和TC需要協(xié)作完成整個(gè)分布式事務(wù)的管控,自然是涉及到網(wǎng)絡(luò)通信,F(xiàn)escar基于Netty實(shí)現(xiàn)了系統(tǒng)間的交互。
下一篇我們先單獨(dú)看看這部分的實(shí)現(xiàn)。Fescar源碼閱讀-RPC和消息