分散式事務框架-seata初識
一、事務與分散式事務
事務,在資料庫中指的是操作資料庫的最小單位,往大了看,事務是應用程式中一系列嚴密的操作,所有操作必須成功完成,否則在每個操作中所作的所有更改都會被撤消。
那為什麼會有分散式事務呢?單機事務是通過將操作限制在一個會話內通過資料庫本身的鎖以及日誌來實現ACID.因為引入了分散式架構,所以事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上.簡單說就是多各資料庫之間無法保證保證各自的操作同時成功或同時失敗。
二、介紹
Seata:Simple Extensible Autonomous Transaction Architecture,簡易可擴充套件的自治式分散式事務管理框架,其前身是fescar。阿里巴巴GTS的開源版實現,是一種分散式事務的解決方案。
三、架構
- Coordinator Core:最下面的模組是事務協調器核心程式碼,主要用來處理事務協調的邏輯,如是否 Commit、Rollback 等協調活動。
- Store:儲存模組,用來將我們的資料持久化,防止重啟或者宕機資料丟失。
- Discover:服務註冊/發現模組,用於將 Server 地址暴露給 Client。
- Config:用來儲存和查詢服務端的配置。
- Lock:鎖模組,用於給 Seata 提供全域性鎖的功能。
- Rpc:用於和其他端通訊。
- HA-Cluster:高可用叢集,目前還沒開源。為 Seata 提供可靠的高可用功能。
四、工作流程
1)參與角色
Transaction Coordinator(TC):管理全域性的分支事務的狀態,用於全域性性事務的提交和回滾。
Transaction Manager(TM):事務管理器,用於開啟全域性事務、提交或者回滾全域性事務,是全域性事務的開啟者。
Resource Manager(RM):資源管理器,用於分支事務上的資源管理,向TC註冊分支事務,上報分支事務的狀態,接受TC的命令來提交或者回滾分支事務。
2)流程
- TM向TC請求發起一個全域性事務,TC返回一個代表這個全域性事務的XID。
- XID在rpc中傳播給每一個呼叫鏈中的服務。
- 每個RM拿到XID後向TC發起一個分支事務,TC返回一個代表這個分支事務的XID。
- RM完成本地分支的業務,提交本地分支,並且報告給TC。
- 全域性事務呼叫鏈處理完畢,TM根據有無異常向TC發起全域性事務的提交或者回滾。
- 假設某個RM本地事務失敗。該RM自身驅動本地事務回滾,並且報告給TC。
- TM檢測到了某個分支事務失敗,向TC發起全域性事務回滾。
- TC給每一個RM傳送訊息,通知它們全部回滾。
- TC將全域性事務回滾的結果傳送給TM,全域性事務結束。
五、設計思想(重點)
Seata 的設計思路是將一個分散式事務可以理解成一個全域性事務,下面掛了若干個分支事務,而一個分支事務是一個滿足 ACID 的本地事務,因此我們可以操作分散式事務像操作本地事務一樣。Seata 的事務提交方式跟 XA 協議的兩段式提交在總體上來說基本是一致的,但XA 協議它依賴的是資料庫層面來保障事務的一致性,也即是說 XA 的各個分支事務是在資料庫層面上驅動的,由於 XA 的各個分支事務需要有 XA 的驅動程式,一方面會導致資料庫與 XA 驅動耦合,另一方面它會導致各個分支的事務資源鎖定週期長,所以效能較差。
Seata 在資料來源做了一層代理層,所以我們使用 Seata 時,我們使用的資料來源實際上用的是 Seata 自帶的資料來源代理 DataSourceProxy,Seata 在這層代理中加入了很多邏輯,主要是解析 SQL,把業務資料在更新前後的資料映象組織成回滾日誌,並將 undo log 日誌插入 undo_log 表中,保證每條更新資料的業務 sql 都有對應的回滾日誌存在。這樣做的好處就是,本地事務執行完可以立即釋放本地事務鎖定的資源,然後向 TC 上報分支狀態。當 TM 決議全域性提交時,就不需要同步協調處理了,TC 會非同步排程各個 RM 分支事務刪除對應的 undo log 日誌即可,這個步驟非常快速地可以完成;當 TM 決議全域性回滾時,RM 收到 TC 傳送的回滾請求,RM 通過 XID 找到對應的 undo log 回滾日誌,然後執行回滾日誌完成回滾操作。
六、其他模式
上面說的是seata的模式模式AT,seata也針對TCC做了適配相容,支援TCC事務方案,原理前面已經介紹過,基本思路就是使用侵入業務上的補償及事務管理器的協調來達到全域性事務的一起提交及回滾。
七、總結
1)優點
- 阿里背書,社群活躍,github1.3w start。
- 相對2pc來說效能有較大提升,避免多個庫鎖定導致的效能急劇下降。
- 使用簡單,學習成本低,對業務無入侵,對於AT模式來說,只需一個註解就可以實現分散式事務。
- 可通過HA-Cluster保證高可用。
- 靈活,拓展性高,配置,服務發現和註冊,全域性鎖,可由使用者自己實現。
2)缺點
- TC不支援叢集部署,一旦TC宕機會導致無法處理分散式事務。
- Seata的引入全域性鎖會額外增加死鎖的風險。
- 單機多資料來源跨服務目前不支援。