分佈式事務框架-seata初識

1、事務與分佈式事務

事務,在數據庫中指的是操做數據庫的最小單位,往大了看,事務是應用程序中一系列嚴密的操做,全部操做必須成功完成,不然在每一個操做中所做的全部更改都會被撤消。git

那爲何會有分佈式事務呢?單機事務是經過將操做限制在一個會話內經過數據庫自己的鎖以及日誌來實現ACID.由於引入了分佈式架構,因此事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位於不一樣的分佈式系統的不一樣節點之上.簡單說就是多各數據庫之間沒法保證保證各自的操做同時成功或同時失敗。github

2、介紹

Seata:Simple Extensible Autonomous Transaction Architecture,簡易可擴展的自治式分佈式事務管理框架,其前身是fescar。阿里巴巴GTS的開源版實現,是一種分佈式事務的解決方案。sql

3、架構

  • Coordinator Core:最下面的模塊是事務協調器核心代碼,主要用來處理事務協調的邏輯,如是否 Commit、Rollback 等協調活動。
  • Store:存儲模塊,用來將咱們的數據持久化,防止重啓或者宕機數據丟失。
  • Discover:服務註冊/發現模塊,用於將 Server 地址暴露給 Client。
  • Config:用來存儲和查找服務端的配置。
  • Lock:鎖模塊,用於給 Seata 提供全局鎖的功能。
  • Rpc:用於和其餘端通訊。
  • HA-Cluster:高可用集羣,目前還沒開源。爲 Seata 提供可靠的高可用功能。

 

4、工做流程

1)參與角色

Transaction Coordinator(TC):管理全局的分支事務的狀態,用於全局性事務的提交和回滾。
Transaction Manager(TM):事務管理器,用於開啓全局事務、提交或者回滾全局事務,是全局事務的開啓者。
Resource Manager(RM):資源管理器,用於分支事務上的資源管理,向TC註冊分支事務,上報分支事務的狀態,接受TC的命令來提交或者回滾分支事務。數據庫

2)流程

  1. TM向TC請求發起一個全局事務,TC返回一個表明這個全局事務的XID。
  2. XID在rpc中傳播給每個調用鏈中的服務。
  3. 每一個RM拿到XID後向TC發起一個分支事務,TC返回一個表明這個分支事務的XID。
  4. RM完成本地分支的業務,提交本地分支,而且報告給TC。
  5. 全局事務調用鏈處理完畢,TM根據有無異常向TC發起全局事務的提交或者回滾。
  6. 假設某個RM本地事務失敗。該RM自身驅動本地事務回滾,而且報告給TC。
  7. TM檢測到了某個分支事務失敗,向TC發起全局事務回滾。
  8. TC給每個RM發送消息,通知它們所有回滾。
  9. TC將全局事務回滾的結果發送給TM,全局事務結束。

5、設計思想(重點)

  Seata 的設計思路是將一個分佈式事務能夠理解成一個全局事務,下面掛了若干個分支事務,而一個分支事務是一個知足 ACID 的本地事務,所以咱們能夠操做分佈式事務像操做本地事務同樣。Seata 的事務提交方式跟 XA 協議的兩段式提交在整體上來講基本是一致的,但XA 協議它依賴的是數據庫層面來保障事務的一致性,也便是說 XA 的各個分支事務是在數據庫層面上驅動的,因爲 XA 的各個分支事務須要有 XA 的驅動程序,一方面會致使數據庫與 XA 驅動耦合,另外一方面它會致使各個分支的事務資源鎖定週期長,因此性能較差。api

  Seata 在數據源作了一層代理層,因此咱們使用 Seata 時,咱們使用的數據源實際上用的是 Seata 自帶的數據源代理 DataSourceProxy,Seata 在這層代理中加入了不少邏輯,主要是解析 SQL,把業務數據在更新先後的數據鏡像組織成回滾日誌,並將 undo log 日誌插入 undo_log 表中,保證每條更新數據的業務 sql 都有對應的回滾日誌存在。這樣作的好處就是,本地事務執行完能夠當即釋放本地事務鎖定的資源,而後向 TC 上報分支狀態。當 TM 決議全局提交時,就不須要同步協調處理了,TC 會異步調度各個 RM 分支事務刪除對應的 undo log 日誌便可,這個步驟很是快速地能夠完成;當 TM 決議全局回滾時,RM 收到 TC 發送的回滾請求,RM 經過 XID 找到對應的 undo log 回滾日誌,而後執行回滾日誌完成回滾操做。服務器

6、其餘模式

  上面說的是seata的模式模式AT,seata也針對TCC作了適配兼容,支持TCC事務方案,原理前面已經介紹過,基本思路就是使用侵入業務上的補償及事務管理器的協調來達到全局事務的一塊兒提交及回滾。架構

7、總結 

1)優勢

  • 阿里背書,社區活躍,github1.3w start。
  • 相對2pc來講性能有較大提高,避免多個庫鎖定致使的性能急劇降低。
  • 使用簡單,學習成本低,對業務無入侵,對於AT模式來講,只需一個註解就能夠實現分佈式事務。
  • 可經過HA-Cluster保證高可用。
  • 靈活,拓展性高,配置,服務發現和註冊,全局鎖,可由用戶本身實現。

2)缺點

  • TC不支持集羣部署,一旦TC宕機會致使沒法處理分佈式事務。
  • Seata的引入全局鎖會額外增長死鎖的風險。
  • 單機多數據源跨服務目前不支持。
相關文章
相關標籤/搜索