溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Seata的實現(xiàn)原理是什么

發(fā)布時間:2021-06-18 10:15:23 來源:億速云 閱讀:350 作者:chen 欄目:開發(fā)技術(shù)

本篇內(nèi)容介紹了“Seata的實現(xiàn)原理是什么”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠?qū)W有所成!

目錄
  • 一、背景

  • 二、分布式事務(wù)規(guī)范

    • 2.1、分布式事務(wù)相關(guān)概念

    • 2.2、分布式事務(wù)實現(xiàn)規(guī)范

      • 2.2.1、XA

      • 2.2.2、柔性事務(wù)的最終一致性

  • 三、Seata 架構(gòu)

    • 3.1、系統(tǒng)組成

      • 3.2、工作模式

        • 3.2.1、AT(Auto Transaction)

        • 3.2.2、TCC

        • 3.2.3、XA模式

    • 四、AT 模式核心實現(xiàn)

      • 4.1、事務(wù)協(xié)調(diào)器的啟動

        • 4.2、事務(wù)管理器的啟動

          • 4.3、資源管理器的啟動

            • 4.4、全局事務(wù)的工作流程

              • 4.4.1、成功的全局事務(wù)處理流程

              • 4.4.2、成功的全局事務(wù)處理流程

            • 4.5、寫隔離實現(xiàn)

              • 4.6、讀隔離實現(xiàn)

              • 五、總結(jié)

                一、背景

                大型廠商根據(jù)分布式事務(wù)實現(xiàn)規(guī)范,實現(xiàn)了不同的分布式框架,以簡化業(yè)務(wù)開發(fā)者處理分布式事務(wù)相關(guān)工作,讓開發(fā)者專注于核心業(yè)務(wù)開發(fā)。

                Seata就是這么一個分布式事務(wù)處理框架,Seata是由阿里開源,前身為Fescar,經(jīng)過品牌升級變身Seata。

                二、分布式事務(wù)規(guī)范

                2.1、分布式事務(wù)相關(guān)概念

                事務(wù):一個程序執(zhí)行單元,是用戶定義的一組操作序列,需要滿足ACID屬性。

                本地事務(wù):事務(wù)由本地資源管理器管理。

                分布式事務(wù):事務(wù)的操作位于不同的節(jié)點。

                分支事務(wù):在分布式事務(wù)中,由資源管理器管理的本地事務(wù)。

                全局事務(wù):一次性操作多個資源管理器完成的事務(wù),由一組分支事務(wù)組成。

                2.2、分布式事務(wù)實現(xiàn)規(guī)范

                對于本地事務(wù),可以借助DBMS系統(tǒng)來實現(xiàn)事務(wù)的管理,但是對于分布式事務(wù),它就無能為力了。對于分布式事務(wù),目前主要有2種思路:XA協(xié)議的強一致規(guī)范以及柔性事務(wù)的最終一致性規(guī)范。

                2.2.1、XA

                XA是基于2階段提交協(xié)議設(shè)計的接口標準,實現(xiàn)了XA規(guī)范的資源管理器就可以參與XA全局事務(wù)。應(yīng)用承擔事務(wù)管理器TM工作,數(shù)據(jù)庫承擔資源管理器RM工作,TM生成全局事務(wù)id,控制RM的提交和回滾。

                Seata的實現(xiàn)原理是什么

                2.2.2、柔性事務(wù)的最終一致性

                該規(guī)范主要有3種實現(xiàn)方式,TCC、MQ事務(wù)消息、本地消息表。(還存在其他一些不常用實現(xiàn)方式如Saga)。

                TCC:try/confirm/cancel,在try階段鎖定資源,confirm階段進行提交,資源鎖定失敗執(zhí)行cancel階段釋放資源。

                Seata的實現(xiàn)原理是什么 Seata的實現(xiàn)原理是什么

                MQ事務(wù)消息:前提消息系統(tǒng)需要支持事務(wù)如RocketMQ,在本地事務(wù)執(zhí)行前,發(fā)送事務(wù)消息prepare,本地事務(wù)執(zhí)行成功,發(fā)送事務(wù)消息commit,實現(xiàn)分布式事務(wù)最終一致性。如果事務(wù)消息commit失敗,RocketMQ會回查消息發(fā)送者確保消息正常提交,如果步驟5執(zhí)行失敗,進行重試,達到最終一致性。

                Seata的實現(xiàn)原理是什么

                本地消息表:跟MQ事務(wù)消息類似,區(qū)別在于MQ不支持事務(wù)消息,需要借助本地數(shù)據(jù)庫的事務(wù)管理能力。在步驟1中將需要發(fā)送的消息和本地事務(wù)一起提交到DB,借助DB的事務(wù)管理確保消息持久化。步驟2應(yīng)用通過本地消息表掃描,重試發(fā)送,確保消息可以發(fā)送成功。

                Seata的實現(xiàn)原理是什么

                三、Seata 架構(gòu)

                3.1、系統(tǒng)組成

                Seata有三個核心組件:

                • Transaction Coordinator(TC,事務(wù)協(xié)調(diào)器)—— 維護全局事務(wù)和分支事務(wù)的狀態(tài),驅(qū)動全局事務(wù)提交或回滾。

                • Transaction Manager(TM,事務(wù)管理器)—— 定義全局事務(wù)的范圍,開始事務(wù)、提交事務(wù)、回滾事務(wù)。

                • Resource Manager(RM,資源管理器):—— 管理分支事務(wù)上的資源,向TC注冊分支事務(wù),匯報分支事務(wù)狀態(tài),驅(qū)動分支事務(wù)的提交或回滾。

                三個組件相互協(xié)作,TC 以 Server 形式獨立部署,TM和RM集成在應(yīng)用中啟動,其整體交互如下:

                Seata的實現(xiàn)原理是什么

                3.2、工作模式

                Seata 支持四種工作模式:

                3.2.1、AT(Auto Transaction)

                AT模式是Seata默認的工作模式。需要基于支持本地 ACID 事務(wù)的關(guān)系型數(shù)據(jù)庫,Java 應(yīng)用,通過 JDBC 訪問數(shù)據(jù)庫。

                整體機制:

                該模式是XA協(xié)議的演變,XA協(xié)議是基于資源管理器實現(xiàn),而AT并不是如此。AT的2個階段分別是:

                一階段:業(yè)務(wù)數(shù)據(jù)和回滾日志記錄在同一個本地事務(wù)中提交,釋放本地鎖和連接資源。二階段:提交異步化,非常快速地完成;回滾通過一階段的回滾日志進行反向補償。

                下圖中,步驟1開啟全局事務(wù);步驟2注冊分支事務(wù),這里對應(yīng)著一階段;步驟3提交或者回滾分支事務(wù),對應(yīng)著二階段。

                Seata的實現(xiàn)原理是什么

                特點:

                優(yōu)點:對代碼無侵入;并發(fā)度高,本地鎖在一階段就會釋放;不需要數(shù)據(jù)庫對XA協(xié)議的支持。

                缺點:只能用在支持ACID的關(guān)系型數(shù)據(jù)庫;SQL解析還不能支持全部語法。

                3.2.2、TCC

                該模式工作分為三個階段:

                Seata的實現(xiàn)原理是什么

                上圖中對于多個分支事務(wù),省略了多次出現(xiàn)的 2.* 步驟。對于全局事務(wù)執(zhí)行過程中業(yè)務(wù)應(yīng)用宕機情況,業(yè)務(wù)應(yīng)用集群中對等節(jié)點會通過從TC獲取相關(guān)會話,從DB加載詳細信息來恢復狀態(tài)機。

                特點:

                優(yōu)點:一階段提交本地事務(wù),無鎖,高性能;事件驅(qū)動架構(gòu),參與者可異步執(zhí)行,高吞吐;補償服務(wù)易于實現(xiàn)。

                缺點:不保證隔離性。

                3.2.3、XA模式

                XA是基于二階段提交設(shè)計的接口標準。對于支持XA的資源管理器,借助Seata框架的XA模式,會使XA方案更簡單易用。使用前提:需要分支數(shù)據(jù)庫支持XA 事務(wù),應(yīng)用為 Java應(yīng)用,且使用JDBC訪問數(shù)據(jù)庫。

                整體機制:

                在 Seata 定義的分布式事務(wù)框架內(nèi),利用事務(wù)資源(數(shù)據(jù)庫、消息服務(wù)等)對 XA 協(xié)議的支持,以 XA 協(xié)議的機制來管理分支事務(wù)的一種 事務(wù)模式。

                執(zhí)行階段:業(yè)務(wù)sql在XA分支中執(zhí)行,由分支事務(wù)的RM管理器管理,然后執(zhí)行XA prepare。完成階段:TM根據(jù)各個分支執(zhí)行結(jié)果通過TC通知各個分支執(zhí)行XA commit或者XA rollback。

                Seata的實現(xiàn)原理是什么

                特點:

                優(yōu)點:繼承了XA協(xié)議的優(yōu)勢,事務(wù)具有強一致性。

                缺點:同樣繼承了XA協(xié)議的劣勢,由于分支事務(wù)長時間開啟,并發(fā)度低。2.5 Seata 各模式對比

                分布式事務(wù)方案沒有銀彈,根據(jù)自己的業(yè)務(wù)特性選擇合適的模式。例如追求強一致性,可以選擇AT和XA,存在和外部系統(tǒng)對接,可以選擇Saga模式,不能依賴本地事務(wù),可以采用TCC等等。結(jié)合各模式的優(yōu)缺點進行選擇。

                Seata的實現(xiàn)原理是什么

                四、AT 模式核心實現(xiàn)

                鑒于Seata支持的模式較多,而其默認的模式是AT,為節(jié)省篇幅,以下圍繞AT模式分析其相關(guān)的核心模塊實現(xiàn)。

                4.1、事務(wù)協(xié)調(diào)器的啟動

                TC(事務(wù)協(xié)調(diào)器)以獨立的服務(wù)啟動,作為Server,維護全局事務(wù)和分支事務(wù)的狀態(tài),驅(qū)動全局事務(wù)提交或回滾。下面是TC的啟動流程:

                Seata的實現(xiàn)原理是什么

                4.2、事務(wù)管理器的啟動

                TM(事務(wù)管理器)集成在應(yīng)用中啟動,負責定義全局事務(wù)的范圍,開始事務(wù)、提交事務(wù)、回滾事務(wù)。
                TM所在應(yīng)用中需要配置GlobalTransactionScannerbean,在應(yīng)用啟動時會進行如下初始化流程:

                Seata的實現(xiàn)原理是什么

                4.3、資源管理器的啟動

                RM(資源管理器)集成在應(yīng)用中啟動,負責管理分支事務(wù)上的資源,向TC注冊分支事務(wù),匯報分支事務(wù)狀態(tài),驅(qū)動分支事務(wù)的提交或回滾。
                RM所在的應(yīng)用中除了需要跟TM一樣配置GlobalTransactionScanner以啟動RMClient,還需要配置DataSourceProxy,以實現(xiàn)對數(shù)據(jù)源訪問代理。該數(shù)據(jù)源代理實現(xiàn)了sql的解析 →生成undo-log →業(yè)務(wù)sql和undo-log一并本地提交等操作。

                4.4、全局事務(wù)的工作流程

                下面以一個簡單的例子來說明全局事務(wù)的工作原理:

                • BusinessService:發(fā)起購買服務(wù)

                • StorageService:庫存管理服務(wù)

                購買操作實現(xiàn)在businessService.purchase中,purchase方法實現(xiàn)上通過GlobalTransaction注解,通過Dubbo服務(wù),調(diào)用了庫存服務(wù)deduct方法方法,樣例如下:

                @GlobalTransactional(timeoutMills = 300000, name = "dubbo-demo-tx")
                public void purchase(String userId, String commodityCode, int orderCount) {
                    storageService.deduct(commodityCode, orderCount);
                    // throw new RuntimeException("xxx");
                }
                4.4.1、成功的全局事務(wù)處理流程

                Seata的實現(xiàn)原理是什么

                4.4.2、成功的全局事務(wù)處理流程

                這里設(shè)定BusinessService在成功調(diào)用StorageService后,本地出現(xiàn)異常。

                Seata的實現(xiàn)原理是什么

                4.5、寫隔離實現(xiàn)

                全局事務(wù)未提交,分支事務(wù)本地已經(jīng)提交的情況下(假設(shè)修改了資源A),如何避免其他事務(wù)在此時修改資源A?Seata采用全局鎖來實現(xiàn),其流程如下:

                Seata的實現(xiàn)原理是什么

                4.6、讀隔離實現(xiàn)

                在數(shù)據(jù)庫本地隔離級別為讀已提交或以上的基礎(chǔ)上,Seata提供了讀未提交,這個很好理解,全局事務(wù)提交前分支事務(wù)本地已經(jīng)提交。如果想要實現(xiàn)讀已提交,則需要在select語句上加for update。

                五、總結(jié)

                Seata是Java領(lǐng)域很強大的分布式事務(wù)框架,其支持了多種模式。其中默認支持的AT模式,相比于傳統(tǒng)的2PC協(xié)議(基于數(shù)據(jù)庫的XA協(xié)議),很好地解決了2PC長期鎖資源的問題,提高了并發(fā)度。Seata支持的各個模式中,AT模式對業(yè)務(wù)零入侵實現(xiàn)分布式事務(wù),對于開發(fā)者更加友好。另外Seata的Server在選擇合適的存儲介質(zhì)時可以進行集群模式,減少單點故障影響。

                “Seata的實現(xiàn)原理是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

                向AI問一下細節(jié)

                免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

                AI