深入淺出Seata的AT模式

来源:https://www.cnblogs.com/cicada-smile/archive/2022/12/02/16943372.html
-Advertisement-
Play Games

在Seata的AT模式中,在服務執行完成後,直接進行RM提交和資源釋放,提供了對CAP理論相對平衡的解決方案,並且沒有侵入業務工程; ...


目錄

單個掉隊,導致集體被動擺爛;

一、業務背景

在分散式架構中,事務管理是個無法避開的複雜問題,雖然有多種解決方案,但是需要根據業務去選擇合適的;

從個人最近幾年的實踐經驗來看,Seata組件的AT模式比較常用,本文從實際的案例出發,來深入分析該模式的原理;

首先創建一個全局事務管理的介面,這裡是在Facade服務中開啟全局事務;

請求經過三個微服務,並且各個服務都進行數據源的操作,然後模擬鏈路成功和異常的情況,來分析不同狀態的邏輯實現;

二、Seata架構

1、核心組件

三大組件

  • TC:事務協調者

即Transaction Coordinator,維護全局和分支事務的狀態,驅動全局事務提交或回滾。

  • TM:事務管理器

即Transaction Manager,定義全局事務的範圍,開始事務、提交事務,回滾事務。

  • RM:資源管理器

即Resource Manager,管理分支事務處理的資源,向TC註冊分支事務,報告分支事務的狀態,驅動分支事務提交或回滾。

基礎交互

TC是需要獨立部署的服務,TM和RM是集成在服務中,三大組件相互協作,共同完成分佈事務的管理;

2、AT模式

事務模型

AT是Seata預設的模式,需要基於支持本地ACID事務的關係型資料庫;Java應用,通過JDBC訪問資料庫;基於案例流程,先分析AT的事務模型;

2.1 TM負責定義全局事務的邊界,向TC申請,開啟一個全局事務;

2.2 全局事務創建成功後,生成全局唯一的XID;

2.3 XID會在微服務請求鏈路上下文中傳播;

2.4 RM向TC註冊分支事務,並歸屬到XID對應的全局事務進行調度;

2.5 TM向TC發起相應XID的全局事務提交或回滾決議;

2.6 TC完成對XID管理的全部分支事務提交或回滾的調度;

核心機制

執行階段:每個微服務的請求完成後,基於本地資料庫的事務能力,保證業務數據和回滾日誌在同一個本地事務中提交,快速釋放連接和對資源的鎖定;

完成階段:全局提交時分支事務已經完成提交,會清理回滾日誌,快速結束流程;全局回滾基於XID和BranchID查詢回滾日誌,完成數據回滾;

數據源代理

在AT模式中,應用需要使用Seata組件中的JDBC代理數據源DataSourceProxy,實現對真正目標數據源的代理訪問;

三、案例分析

1、流程分析

案例的簡單描述

在案例中涉及三個服務,Facade服務開啟全局事務,然後分別請求Account和Quartz服務的更新介面,通過Quartz介面是否拋異常來調試AT模式的原理;

從實際的請求執行來說,絕大多數的請求都是可以執行成功的,而AT模式的非同步化提交極大限度的顧及全局事務的效率問題,少數失敗的情況也可以通過回滾日誌進行反向補償;

2、寫隔離

上述流程分析AT模式的原子性,即多個分支事務要麼都成功要麼都失敗,接下來分析多個事務中的全局鎖隔離機制,先看寫隔離,假設TX1先開始;

TX1邏輯

  • TX1開始本地事務,拿到本地鎖,然後執行更新操作;
  • TX1本地事務提交前,需要先獲取全局鎖,否則無法提交;
  • TX1獲取全局鎖並提交,釋放本地鎖,但未釋放全局鎖;

TX2邏輯

  • TX2此時開始本地事務,拿到本地鎖;
  • TX2執行本地事務提交前,嘗試獲取全局鎖;
  • 由於全局鎖被TX1持有,TX2會重試等待全局鎖;

假設TX1全局提交

  • TX1如果全局事務提交,會釋放全局鎖;
  • TX2獲取全局鎖成功,執行本地事務提交;

假設TX1全局回滾

  • TX1如果全局事務回滾,要重新獲取數據的本地鎖,進行回滾的補償動作;
  • TX2如果仍在等待全局鎖,並且還持有本地鎖,TX1事務回滾失敗,會不斷的重試;
  • 當TX2等待全局鎖超時,會放棄全局鎖並回滾本地事務,釋放本地鎖;
  • TX1最終獲取數據的本地鎖,完成回滾動作;

在該過程中,TX1在結束前一直持有全局鎖,TX2獲取不到全局鎖無法對相同的數據執行更新動作,所以避免了臟寫的問題;

3、讀隔離

在資料庫本地隔離級別為讀已提交或以上的基礎上,Seata的AT模式預設全局隔離級別是讀未提交;如果需要全局的讀已提交,可以通過SELECT FOR UPDATE語句的代理;

該語句的執行也需要獲取全局鎖,如果全局鎖被TX1持有,TX2會釋放本地鎖,查詢會被阻塞併進行重試,拿到全局鎖讀取成功後返回;

四、對比XA模式

XA是一個分散式事務分段提交協議;事務管理器即TM:作為全局事務的調度者,負責整個事務中本地資源的提交和回滾;本地資源管理器即RM:大部分關係型資料庫都實現了XA介面;

TM先向所有的參與事務的RM發送確認請求,根據確認的結果,判斷是調用RM的commit提交還是rollback回滾;

XA具有強一致性,在2段提交的過程中,會持有資源的鎖,如果是在交易下單等複雜鏈路中,並且併發量很高,會存在長事務風險,XA無法滿足該類高併發的場景;

而在Seata的AT模式中,在服務執行完成後,直接進行RM提交和資源釋放,提供了對CAP理論相對平衡的解決方案,並且沒有侵入業務工程;

五、參考源碼

應用倉庫:
https://gitee.com/cicadasmile/butte-flyer-parent

組件封裝:
https://gitee.com/cicadasmile/butte-frame-parent
Gitee主頁: https://gitee.com/cicadasmile/butte-java-note
您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Odoo安裝/更新模塊原理 Odoo每次安裝/更新模塊時,會進行以下幾步處理: 1.判斷是否需要創建表,如果需要創建且表不存在,則進行表的創建(不進行欄位的創建); 2.獲取該表中已經存在的欄位; 3.獲取odoo模型中的所有欄位; 4.遍歷欄位,對需要存儲的欄位,進行欄位的更新/創建,欄位屬性的更 ...
  • 前言 為什麼選擇自己開發一個詞典 市面上的詞典都不太彳亍,有Golden Dict和歐陸詞典這類註重詞典文件的,有有道詞典這類電子詞典,前者對於查詞更偏向於內容整合,後者則是釋義與例句。對於翻譯功能,兩者則都沒有整合,個人感覺很是麻煩,所以出於個人需要,決定自行開發。 開發的經歷 因為自己很喜歡UW ...
  • 代碼1 int main(){ //裸指針,手動開闢,需要自己釋放,如果忘記了或者因為 //程式邏輯導致p沒有釋放,那麼就會導致記憶體泄漏 int *p=new int(10); if(***){ retur -1; } delete p; return 0; } 有沒有什麼辦法幫我們管理指針,確保資 ...
  • 我國目前並未出台專門針對網路爬蟲技術的法律規範,但在司法實踐中,相關判決已屢見不鮮,K 哥特設了“K哥爬蟲普法”專欄,本欄目通過對真實案例的分析,旨在提高廣大爬蟲工程師的法律意識,知曉如何合法合規利用爬蟲技術,警鐘長鳴,做一個守法、護法、有原則的技術人員。 案情介紹 谷米公司為開發和運營“酷米客”A ...
  • Android ViewPager2 + Fragment + BottomNavigationView 聯動 本篇主要介紹一下 ViewPager2 + Fragment + BottomNavigationView , 上篇中把ViewPager2和Fragment 聯動起來了, 本篇主要把 B ...
  • JZ23 鏈表中環的入口結點 描述 給一個長度為n鏈表,若其中包含環,請找出該鏈表的環的入口結點,否則,返回null。 解析 環很大 在前面我們提到過快慢指針,判斷是否有環。如果有環,在來找環的入口。如果沒環直接返回null即可,我們假設是有環的,那麼會有兩種情況,一種是O型,一種是6型,其實原理都 ...
  • Map源碼剖析 HashMap&LinkedHashMap&Hashtable hashMap預設的閾值是0.75 HashMap put操作 put操作涉及3種結構,普通node節點,鏈表節點,紅黑樹節點,針對第三種,紅黑樹節點,我們後續單獨去學習,這裡不多做擴散 final V putVal(i ...
  • 來源:https://www.cnblogs.com/prayjourney/p/9667835.html 在一個應用系統中, 無論使用何種語言開發, 必然存在模塊之間的調用, 調用的方式分為幾種。 1.同步調用 同步調用是最基本並且最簡單的一種調用方式, 類A的方法a()調用類B的方法b(), 一 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...