Fescar源碼閱讀-解決分布式事務(wù)的利器

知其然,知其所以然!



目前分布式系統(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):


image.png
  • 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

官網(wǎ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é)任劃分,稍加整理,如下圖:


FescarRM-define.png

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

TM+RM+TC

先整理一下目前官方提供的實(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.DefaultCorecom.alibaba.fescar.server.coordinator.DefaultCoordinator

DefaultCore 實(shí)現(xiàn)了TransactionManagerResourceManagerOutbound
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和消息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容