新聞中心
Spring Cloud Alibaba分布式事務解決框架Seata概念入門篇
作者:Thinking曹 2020-12-08 11:43:03
開發(fā)
架構
分布式 本篇給大家?guī)鞸pring Cloud Alibaba開源的一款分布式解決方案框架Seata,本篇為Seata組件的相關概念介紹,如果想使用Seata實戰(zhàn)解決分布式事務難題還請看下一篇文章。

創(chuàng)新互聯(lián)建站是一家專注于成都做網(wǎng)站、成都網(wǎng)站設計與策劃設計,北塔網(wǎng)站建設哪家好?創(chuàng)新互聯(lián)建站做網(wǎng)站,專注于網(wǎng)站建設十載,網(wǎng)設計領域的專業(yè)建站公司;建站業(yè)務涵蓋:北塔等地區(qū)。北塔做網(wǎng)站價格咨詢:13518219792
Seata中文參考文檔: http://seata.io/zh-cn/docs/overview/what-is-seata.html
前言
繼上一篇文章 分布式事務解決方案及理論基礎入門 介紹了分布式解決方案相關概念之后,本篇給大家?guī)鞸pring Cloud Alibaba開源的一款分布式解決方案框架Seata,本篇為Seata組件的相關概念介紹,如果想使用Seata實戰(zhàn)解決分布式事務難題還請看下一篇文章。
一、什么是微服務架構
“微服務架構是一種架構模式,它提倡將單一應用程序劃分成一組小的服務,服務之間相互協(xié)調、互相配合,為用戶提供最終價值。每個服務運行在其獨立的進程中,服務和服務之間采用輕量級的通信機制相互溝通(通常是基于HTTP的Restful API).每個服務都圍繞著具體的業(yè)務進行構建,并且能夠被獨立的部署到生產(chǎn)環(huán)境、類生產(chǎn)環(huán)境等。另外,應盡量避免統(tǒng)一的、集中的服務管理機制,對具體的一個服務而言,應根據(jù)業(yè)務上下文,選擇合適的語言、工具對其進行構建"
二、分布式事務的產(chǎn)生
1. 單體架構
一個用戶完整的下單過程,在單體應用中,只需要一個在一個項目中,一個數(shù)據(jù)庫里,通過調用下下單接口,下單時調用扣減庫存方法和扣減賬戶余額來完成一筆訂單。
2. 分布式架構
單體應用被拆分成微服務應用,原來的三個模塊被拆分成三個獨立的應用,分別使用不同的數(shù)據(jù)源,在業(yè)務操作上需要調用三個服務來完成。此時每個服務內(nèi)部的數(shù)據(jù)一致性由本地事務來保證,但是全局的數(shù)據(jù)一致性問題沒法保證,分布式事務由此產(chǎn)生。
三、Seata的4種事務模式
1. Seata是什么
Seata 是一款開源的分布式事務解決方案,致力于提供高性能和簡單易用的分布式事務服務。Seata 將為用戶提供了 AT、TCC、SAGA 和 XA 事務模式,默認使用AT模式,為用戶打造一站式的分布式解決方案。
2. AT 模式
前提
- 基于支持本地 ACID 事務的關系型數(shù)據(jù)庫。
- Java 應用,通過 JDBC 訪問數(shù)據(jù)庫。
整體機制
通過2PC兩階段提交協(xié)議的演變:
- 一階段: 業(yè)務數(shù)據(jù)和回滾日志記錄在同一個本地事務中提交,釋放本地鎖和連接資源。
- 二階段: 提交異步化,成功則批量地刪除相應回滾日志記錄,失敗則通過回滾日志進行反向補償。
寫隔離
- 1)、 一階段本地事務提交前,需要確保先拿到全局鎖。
- 2)、拿不到全局鎖,不能提交本地事務;拿到全局鎖,提交本地事務并插入undo_log記錄。
- 3)、拿全局鎖的嘗試被限制在一定范圍內(nèi),超出范圍將放棄,并根據(jù)undo_log記錄回滾本地事務,釋放本地鎖。
讀隔離
1)、在數(shù)據(jù)庫本地事務隔離級別 讀已提交(Read Committed) 或以上的基礎上,Seata(AT 模式)的默認全局隔離級別是 讀未提交(Read Uncommitted)。
理解: 在全局事務提交之前,本地事務會先提交,這時候查詢數(shù)據(jù),對于本地庫是Read Committed,對于全局來說是 Read Uncommitted。
2)、如果要求全局的讀已提交,目前 Seata 的方式是通過 SELECT FOR UPDATE 語句的代理。
3. TCC模式
TCC不依賴 RM 對分布式事務的支持,而是通過對業(yè)務邏輯的分解來實現(xiàn)分布式事務。
- 1)、初步操作 Try: 完成所有業(yè)務檢查,預留必須的業(yè)務資源。
- 2)、確認操作 Confirm: 真正執(zhí)行的業(yè)務邏輯,不做任何業(yè)務檢查,只使用 Try 階段預留的業(yè)務資源。因此,只要 Try 操作成功,Confirm 必須能成功。另外,Confirm 操作需滿足冪等性,保證一筆分布式事務能且只能成功一次。
- 3)、取消操作 Cancel: 釋放 Try 階段預留的業(yè)務資源。同樣的,Cancel 操作也需要滿足冪等性。
所謂 TCC 模式,是指支持把 自定義 的分支事務納入到全局事務的管理中。
4. SAGA模式
概述
Seata提供的長事務解決方案,在Saga模式中,業(yè)務流程中每個參與者都提交本地事務,當出現(xiàn)某一個參與者失敗則補償前面已經(jīng)成功的參與者,一階段正向服務和二階段補償服務都由業(yè)務開發(fā)實現(xiàn)。
適用場景:
- 業(yè)務流程長、業(yè)務流程多
- 參與者包含其它公司或遺留系統(tǒng)服務,無法提供 TCC 模式要求的三個接口
優(yōu)勢:
- 一階段提交本地事務,無鎖,高性能
- 事件驅動架構,參與者可異步執(zhí)行,高吞吐
- 補償服務易于實現(xiàn)
缺點:
不保證隔離性
基于狀態(tài)機引擎的 Saga 實現(xiàn)。
目前SEATA提供的Saga模式是基于狀態(tài)機引擎來實現(xiàn)的,機制是:
- 通過狀態(tài)圖來定義服務調用的流程并生成 json 狀態(tài)語言定義文件。
- 狀態(tài)圖中一個節(jié)點可以是調用一個服務,節(jié)點可以配置它的補償節(jié)點。
- 狀態(tài)圖 json 由狀態(tài)機引擎驅動執(zhí)行,當出現(xiàn)異常時狀態(tài)引擎反向執(zhí)行已成功節(jié)點對應的補償節(jié)點將事務回滾,異常發(fā)生時是否進行補償也可由用戶自定義決定。
- 可以實現(xiàn)服務編排需求,支持單項選擇、并發(fā)、子流程、參數(shù)轉換、參數(shù)映射、服務執(zhí)行狀態(tài)判斷、異常捕獲等功能。
示例狀態(tài)圖:
5. XA 模式
前提
- 支持XA 事務的數(shù)據(jù)庫。
- Java 應用,通過 JDBC 訪問數(shù)據(jù)庫。
整體機制
在 Seata 定義的分布式事務框架內(nèi),利用事務資源(數(shù)據(jù)庫、消息服務等)對 XA 協(xié)議的支持,以 XA 協(xié)議的機制來管理分支事務的一種 事務模式。
執(zhí)行階段:
- 可回滾:業(yè)務 SQL 操作放在 XA 分支中進行,由資源對 XA 協(xié)議的支持來保證 可回滾
- 持久化:XA 分支完成后,執(zhí)行 XA prepare,同樣,由資源對 XA 協(xié)議的支持來保證 持久化(即,之后任何意外都不會造成無法回滾的情況)
完成階段:
- 分支提交:執(zhí)行 XA 分支的 commit
- 分支回滾:執(zhí)行 XA 分支的 rollback
關于XA模式的介紹這里先簡單提一下,更詳細的信息查閱 :http://seata.io/zh-cn/docs/dev/mode/xa-mode.html
四、Seata模型介紹
Seata的整個過程模型如下圖所示:
上圖中主要有三種角色:
- TM:事務管理者,用來告訴 TC,全局事務的開始,提交,回滾。
- TC:事務協(xié)調者,即seata-server,維護全局事務和分支事務的狀態(tài),通知各RM提交或者回滾。
- RM:資源管理者,每一個 RM 都會作為一個分支事務注冊在 TC,負責分支事務的注冊、提交和回滾。
術語介紹:
- XID - Transaction ID ,一個分布式事務唯一一個ID。
- TC - 事務協(xié)調者,維護全局和分支事務的狀態(tài),驅動全局事務提交或回滾。
- TM - 事務管理器,定義全局事務的范圍:開始全局事務、提交或回滾全局事務。
- RM - 資源管理器,管理分支事務處理的資源,與TC交談以注冊分支事務和報告分支事務的狀態(tài),并驅動分支事務提交或回滾。
典型的分布式事務處理流程包括以下步驟:
- TM向TC請求開啟一個全局事務,TC給TM返回一個全局事務的XID,即XID;
- XID在微服務調用鏈路的上下文間傳播;
- RM向TC注冊分支事務,將其納入XID對應全局事務的管轄;
- TM根據(jù)XID向TC發(fā)出提交或者回滾的請求;
- TC根據(jù)XID使RM提交或者回滾
流程圖如下:
五、關于Seata架構
早在2019年,阿里開源了分布式事務框架Seata,原名叫Fescar,后來跟螞蟻TCC方案整合后改名為Seata,截止目前2020年11月3日,Seata已經(jīng)更新到v1.4.0版本了,雖然在之前的版本發(fā)布中,存在一些潛在的問題,但是通過開源團隊快速修復問題,并且快速迭代發(fā)布新版本之下,目前相對較穩(wěn)定。
同時相比與其它分布式事務框架,Seata架構的亮點主要有幾個:
- 應用層基于SQL解析實現(xiàn)了自動補償,從而最大程度的降低業(yè)務侵入性;
- 將分布式事務中TC(事務協(xié)調者)獨立部署,負責事務的注冊、回滾;
- 通過全局鎖實現(xiàn)了寫隔離與讀隔離。
六、參考文檔
Seata中文官方文檔: http://seata.io/zh-cn/docs/overview/what-is-seata.html
Seata-Server下載地址: https://github.com/seata/seata/releases
分布式事務Demo: https://github.com/seata/seata-samples
Seata源碼地址: https://github.com/seata/seataSeata中文參考文檔: http://seata.io/zh-cn/docs/overview/what-is-seata.html
網(wǎng)頁標題:SpringCloudAlibaba分布式事務解決框架Seata概念入門篇
網(wǎng)頁網(wǎng)址:http://m.5511xx.com/article/codjscs.html


咨詢
建站咨詢
