微服務的分布式事務解決方案

微服務的分布式事務解決方案

  • 1、分布式事務的理論模型
    • 1.1、X/Open 分布式事務模型
    • 1.2、兩階段提交協議
    • 1.3、三階段提交協議
  • 2、分布式事務常見解決方案
    • 2.1、TCC補償型方案
    • 2.2、基于可靠性消息的最終一致性方案
    • 2.3、最大努力通知型方案
  • 3、分布式事務中間件 Seata
    • 3.1、AT 模式
    • 3.2、Saga 模式

???????說起微服務的架構,分布式事務是一道繞不開的話題。本文將從分布式事務的理論模型、分布式事務的常見解決方案、分布式事務中間件 Seata的兩個常用模式展開說說分布式事務。

?

1、分布式事務的理論模型

?
兩階段提交協議、三階段提交 ,作為 XA 協議解決分布式數據一致性問題的基本原理。
?

1.1、X/Open 分布式事務模型

?

X/Open DTP 是 X/Open 定義的一套分布式事務標準,該標準使用兩階段提交來保證分布式事務的完整性。
在這里插入圖片描述

X/Open DTP 中包含三種角色

  • ① Application(AP):指應用程序。
  • ② Resource Manager(RM):指資源管理器,比如數據庫。
  • ③ Transaction Manager(TM):指事務管理器,事務協調者,負責協調和管理事務,提供AP編程接口或管理RM.

?

1.2、兩階段提交協議

?
兩階段提交協議的執行流程:

  • 準備階段:TM 通知 RM 準備分支事務,記錄事務日志,并告知 TM 的準備結果。
  • 提交/回滾階段
    • 如果所有的 RM 在準備階段都明確返回成功,則 TM 向所有的 RM 發起事務提交指令,完成數據變更。
    • 反之,如果任何一個 RM 明確返回失敗,則 TM 會向所有 RM 發送事務回滾指令。

在這里插入圖片描述

兩階段提交的缺點

  • 同步阻塞

    • 所有參與的 RM 都是事務阻塞型,對于任何一次指令都必須有明確的響應,才能繼續進行下一步。
    • 否則會處于阻塞狀態,占用的資源一直被鎖定。
  • 過于保守:任何一個節點失敗都會導致數據回滾。

  • TM 的單點故障:如果 TM 在第二階段出現故障,那其他參與的RM 會一直處于鎖定狀態。

  • “腦裂” 導致數據不一致問題:第二階段中 TM 向所有的 RM 發送 commit 請求后,發生局部網絡異常,導致只要一部分 RM 接收到 commit 請求,進而執行了 commit 操作。另一部分 RM 未收到 commit 請求,從而事務無法提交,導致數據不一致問題發生。

?

1.3、三階段提交協議

?

**三階段提交協議執行流程**如下:

  • CanCommit(詢問階段):TM 向 RM 發送事務執行請求,詢問是否可以完成指令,RM 只需要回答是或者不是即可,不需要做真正的事務操作,該階段會有超時中止機制。

  • PreCommit(準備階段):TM 會根據所有 RM 的反饋結果決定是否繼續執行。

    • 如果在 CanCommit 階段所有 RM 都返回可以執行操作,則 TM 會向所有 RM 發送 PreCommit 請求,所有 RM 收到請求后寫 redo 和 undo 日志執行事務操作但不提交事務,然后返回 ACK 響應等待 TM 的下一步通知。
    • 如果在 CanCommit 階段,任意 RM 返回不能執行操作的結果,那 TM 會向所有參與者發送事務中斷請求。
  • DoCommit(提交或回滾階段):該階段根據 PreCommit 階段執行的結果,來決定 DoCommit 的執行方式。

    • 如果每個 RM 在 PreCommit 階段都返回成功,那么 TM 會向所有 RM 發起事務提交指令。
    • 如果任何一個 RM 返回失敗,那么 TM 會發起中止指令來回滾事務。
      在這里插入圖片描述

相對于二階段提交協議,三階段提交協議利用超時機制,解決了同步阻塞問題。兩者的區別如下:

  • ① 增加了 CanCommit 階段,用于詢問所有 RM 是否可以執行事務操作并響應,其目的是可以盡早發現無法執行操作而中止后續的行為
  • 在準備階段之后,TM 和 RM 都引入了超時機制,一旦超時TM 和 RM 會繼續提交事務,并且認為處于成功狀態,因為在超時情況下事務默認成功的可能性比較大。超時機制避免了資源的永久鎖定
    ?

2、分布式事務常見解決方案

?

2.1、TCC補償型方案

?

TCC(Try-Confirm-Cancel)是一種兩階段提交的思想,也是一種比較成熟分布式事務一致性解決方案。TCC 補償型方案將一個完整事務分為三個步驟:

  • Try :該階段主要是對數據的校驗,或者資源的預留。
  • Confirm :該階段確認真正執行的任務,只操作 Try 階段預留的資源。
  • Cancel :該階段是取消執行,釋放 Try 階段預留的資源。

在這里插入圖片描述

注意:在某些特殊場景下,比如服務器突然宕機,導致該服務并沒有收到 TCC 事務協調器的 Cancel 或者 Confirm 請求,這時 TCC 事務框架會記錄一些分布式事務的操作日志,保存分布式事務運行的各個階段和狀態。TCC 事務協調器會根據操作日志進行重試,以達到數據的最終一致性

TCC 服務支持接口調用失敗發起重試,所以 TCC 暴露的接口都需要滿足冪等性

?

2.2、基于可靠性消息的最終一致性方案

?

???????RocketMQ 事務消息模型最核心的機制,就是事務回查。下圖可以看出,在 RocketMQ 事務消息模型中,事務是由生產者完成。消息隊列的可靠性投遞機制,保證了消費者如果沒有簽收消息,消息隊列服務器會重復投遞。具體可以參考博文 《RocketMQ 順序消息和事務消息及其原理》 的 【RocketMQ 的事務消息】部分。

在這里插入圖片描述
?

2.3、最大努力通知型方案

?

???????最大努力通知也被稱為定期校對,是以上【基于可靠性消息的最終一致性方案】的優化版,其引入了本地消息表來記錄錯誤消息,然后加入失敗消息的定期校對功能,來進一步保證消息被下游系統消費。
?
在這里插入圖片描述

最大努力通知方案步驟:

  • 第一步:消息由系統A投遞到中間件

    • ① 業務處理中,操作業務數據入庫時,在同一事務中向本地消息表中寫一條數據,且數據狀態為【未發送】。
    • ② 一般采用定時任務,輪詢本地消息表中【未發送】狀態的數據,將這部分數據發送到消息中間件。
    • ③ 消息中間件收到消息后,通過消息中間件的返回應答狀態,修改本地消息表狀態為【發送成功】。
  • 第二步:消息中間件投遞到系統B

    • ① 消息中間件收到第一步的消息后,同步投遞給相應的下游系統,并觸發下游系統的業務執行。
    • ② 當下游系統業務處理成功后,向消息中間件反饋確認應答,消息中間件便可以將消息刪除,從而完成該事務。
    • ③ 對于投遞失敗的消息,利用重試機制進行重試,對于重試失敗的,寫入錯誤消息表。
    • ④ 消息中間件需要提供失敗消息的查詢接口,下游系統會定期查詢失敗消息。

最大努力通知方案缺點:消息表會耦合到業務系統中,如果沒有封裝好的解決方案,會增加系統的復雜度。

?

3、分布式事務中間件 Seata

?

Seata 組件作為一種分布式解決方案,提供了 AT、TCC、Saga 和 XA 事務模型。

3.1、AT 模式

?
???????AT 模式是基于 XA 模式演化而來的,AT 和 XA 都是兩階段事務模型,但是 AT 和XA 相比,做了很多優化。AT 模式作為 Seata 最主推的分布式事務解決方案。

???????AT 模式由 TM、RM 和 TC 三大模塊組成,其中 TM 和 RM 作為客戶端與業務系統(Application)集成,TC 作為 Seata 的服務器獨立部署。AT 模式的執行流程:

  • ① TM 向 TC 注冊全局事務,并生成全局唯一的 XID.
  • ② RM 向 TC 注冊分支事務,并將其納入該 XID 對應的全局事務范圍。
  • ③ RM 向 TC 匯報資源的準備狀態。
  • ④ TC 匯總所有事務參與者的執行狀態,決定分布式事務是全部回滾還是提交。
  • ⑤ TC 通知所有 RM 提交/回滾事務。

在這里插入圖片描述

???????Seata的AT模式在性能、一致性模型、侵入性、依賴性和靈活性以及配置和部署等方面,相對于XA模式進行了顯著的改進。這些改進使得AT模式成為了一種更加高效、易用和靈活的分布式事務解決方案。

1. 性能提升

  • 資源鎖定周期縮短:XA模式一階段不提交事務,鎖定資源直到二階段結束才釋放,這可能導致性能瓶頸。而AT模式一階段直接提交事務,不鎖定資源,從而縮短了資源鎖定周期,提高了系統性能。
  • 減少數據庫交互:AT模式通過記錄數據快照(undo log)來實現回滾,減少了與數據庫的交互次數,進一步提升了性能。

2. 一致性模型

  • 最終一致性 vs 強一致性:XA模式遵循兩階段提交協議,保證事務的強一致性(滿足ACID原則)。而AT模式則通過數據快照和全局鎖來實現最終一致性,雖然數據不是實時一致的,但在最終狀態上保持一致,這種模型在某些場景下可以接受,并且減少了鎖的使用,提高了性能。

3. 侵入性降低

  • 代碼侵入性:XA模式通常需要業務代碼顯式地參與事務管理,如調用XA接口等。而AT模式則是一種無侵入的分布式事務解決方案,用戶只需關注自己的業務SQL,Seata框架會自動處理事務的二階段提交和回滾操作,降低了對業務代碼的侵入性。

4. 依賴性和靈活性

  • 數據庫依賴性:XA模式高度依賴關系型數據庫來實現事務的強一致性。而AT模式雖然也依賴數據庫,但更多地是通過Seata框架的數據快照和全局鎖機制來實現最終一致性,因此對數據庫的依賴性和要求相對較低。
  • 靈活性:AT模式提供了更高的靈活性,它支持多種數據庫類型(如MySQL、Oracle、PostgreSQL和TiDB等),并且可以根據業務需求進行靈活配置和調整。

?

3.2、Saga 模式

?

???????Saga 模式是一種長事務解決方案,其核心思想是將一個業務流程中的長事務,拆分成多個本地短事務。業務流程中的每個參與者都提交真實的提交給本地短事務,當其中一個參與者事務執行失敗,則通過補償機制補償前面已經成功的參于者。
在這里插入圖片描述

???????Sage 由一系列 sub-transaction T i 組成,每個 T i 都有對應的補償動作 C i,補償動作用于撤銷 T i 造成的數據變更結果。每一個 T i 操作都真實的影響數據庫。
?
Sage 模式的兩種執行方式

  • T1、T2、T3、 … 、T i :這種方式表示所有事務都正常執行。
  • T1、T2、 … 、T j、C j 、… 、C2、C1(其中 0 < j < i):這種方式表示執行到 T j 事務時出現異常,通過補充操作撤銷之前所有成功的 sub-transaction.

Sage 提供了兩種補償恢復方式

  • ① 向后恢復:如果任一子事務執行失敗,則把之前執行的結果逐一撤銷。
  • ② 向前恢復:該恢復方式不進行補償,而是對失敗的事務進行重試,其比較適合于事務必須要執行成功的場景。

Saga 的優劣勢

  • 和XA 和 TCC 相比,Saga 的一階段直接提交本地事務,沒有鎖等待,性能比較高;在事件驅動的模式下,短事務可以異步執行;補償機制的實現比較簡單。
  • Sage 的缺點是并不提供原子性和隔離性支持,隔離性的影響比較大。比如 業務中贈送了一張優惠券,若用戶將優惠券使用了,且事務如果出現異常要回滾就會出現問題。

?
?
?
?
?
?
?
.

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41439.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41439.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41439.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

人工智能在軟件開發中的角色:助手還是取代者?

人工智能在軟件開發中的角色&#xff1a;助手還是取代者&#xff1f; 隨著科技的飛速發展&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;在軟件開發領域的應用越來越廣泛。從代碼生成、錯誤檢測到自動化測試&#xff0c;AI工具正成為開發者的重要助手。然而&#xf…

Postgresql - 用戶權限數據庫

1、綜述 在實際的軟件項目開發過程中&#xff0c;用戶權限控制可以說是所有運營系統中必不可少的一個重點功能&#xff0c;根據業務的復雜度&#xff0c;設計的時候可深可淺&#xff0c;但無論怎么變化&#xff0c;設計的思路基本都是圍繞著用戶、部門、角色、菜單這幾個部分展…

Django QuerySet對象,filter()方法

filter()方法 用于實現數據過濾功能&#xff0c;相當于sql語句中的where子句。 filter(字段名__exact10) 或 filter(字段名10)類似sql 中的 10 filter(字段名__gt10) 類似SQL中的 >10 filter(price__lt29.99) 類似sql中的 <29.99 filter(字段名__gte10, 字段名__lte20…

程序升級bootloader

文章目錄 概述什么是bootloader&#xff1f;為什么用&#xff1f;bootloader啟動流程圖步驟 下載過程代碼獲取本地配置信息獲取主機傳過來的配置信息bootloader發送2給上位機&#xff0c;上位機發送文件給bootloader根據網站復制CRC 燒寫flasherase啟動編譯問題 概述 用keil編…

聲明隊列和交換機 + 消息轉換器

目錄 1、聲明隊列和交換機 方法一&#xff1a;基于Bean的方式聲明 方法二&#xff1a;基于Spring注解的方式聲明 2、消息轉換器 1、聲明隊列和交換機 方法一&#xff1a;基于Bean的方式聲明 注&#xff1a;隊列和交換機的聲明是放在消費者這邊的&#xff0c;這位發送的人他…

Dynamic Web Module facet version問題

The default superclass, "javax.servlet.http.HttpServlet", according to the projects Dynamic Web Module facet version (3.1), was not found on the Java Build Path. 1.右鍵項目 2.點擊Properties 3.點擊Java Build Path&#xff0c;右邊找到Libraries&…

大模型在營銷領域的探索及創新

1 AIGA介紹 2 AIGA在營銷領域的 應用和探索 3 總結與展望

java 如何暴露header給前端

在Java中&#xff0c;將HTTP響應的Header暴露給前端通常涉及在Web應用程序的服務器端代碼中設置這些Header。這可以通過不同的Java Web框架來實現&#xff0c;比如Spring MVC、JAX-RS&#xff08;Jersey&#xff09;、Servlet等。這里&#xff0c;我將提供一個使用Spring MVC框…

學習筆記——交通安全分析13

目錄 前言 當天學習筆記整理 5城市主干道交通安全分析 結束語 前言 #隨著上一輪SPSS學習完成之后&#xff0c;本人又開始了新教材《交通安全分析》的學習 #整理過程不易&#xff0c;喜歡UP就點個免費的關注趴 #本期內容接上一期12筆記 當天學習筆記整理 5城市主干道交…

docker-compose Install gitlab 17.1.1

gitlab 前言 GitLab 是一個非常流行的開源 DevOps 平臺,用于軟件開發項目的整個生命周期管理。它提供了從版本控制、持續集成/持續部署(CI/CD)、項目規劃到監控和安全的一系列工具。 前提要求 Linux安裝 docker docker-compose 參考Windows 10 ,11 2022 docker docker-c…

多線程爬蟲技術詳解

&#x1f380;引言?? 在當今信息爆炸的時代&#xff0c;網絡爬蟲&#xff08;Web Crawler&#xff09;作為一種自動獲取網頁內容的程序&#xff0c;已經成為數據挖掘和信息檢索不可或缺的工具。多線程爬蟲作為提高爬蟲效率的重要手段&#xff0c;通過并行處理技術大幅度提升…

開發個人Go-ChatGPT--4 用戶管理

開發個人Go-ChatGPT–4 用戶管理 先看下我的目錄結構&#xff0c;可以根據個人愛好&#xff0c;進行重構 |-- Dockerfile |-- LICENSE |-- common | |-- callmodel | | |-- gemma.go | | -- models.go | |-- consts | | |-- code.go | | |-- common.go |…

k8s 部署RuoYi-Vue-Plus之nginx部署

1.掛載存儲 可參考 之前文章設置 https://blog.csdn.net/weimeibuqieryu/article/details/140183843 2.部署yaml 先創建命名空間ruoyi, 有就不用創建了 kubectl create namespace ruoyi我暫不需要使用xxjob和Monitor模塊, 所以去除了. 有需要再自行添加 需要先啟動后端服務…

(ECCV,2022)Mask-CLIP:從CLIP中提取自由密集標簽

文章目錄 Extract Free Dense Labels from CLIP相關資料摘要引言方法Mask-CLIPMask-CLIP 實驗 Extract Free Dense Labels from CLIP 相關資料 代碼&#xff1a;https://github.com/chongzhou96/MaskCLIP 論文&#xff1a;https://arxiv.org/abs/2112.01071 摘要 對比語言-…

SprongBoot及其基礎應用全套部署腳本和配置

POM.xml配置 </dependencies> <!--skywalking日志監控依賴--><dependency><groupId>org.apache.skywalking</groupId><artifactId>apm-toolkit-logback-1.x</artifactId><version>8.5.0</version></dependency&g…

修改編譯依賴openssl的libcrypto.so

由于centos7默認使用openssl1.0.2k的libcrypto.so.10共享庫。即使openssl升級為3.0.11后&#xff0c;編譯使用ldd命令查看共享庫依舊會引用libcrypto.so.10。 現希望引用libcrypto.so.3&#xff0c;需要在生成動態鏈接庫的CMakeLists.txt中增加如下配置&#xff0c;明確指定ope…

《警世賢文》摘抄:守法篇、惜時篇、修性篇、修身篇、待人篇、防人篇(建議多讀書、多看報、少吃零食多睡覺)

若該文為原創文章&#xff0c;轉載請注明原文出處 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/140243440 長沙紅胖子Qt&#xff08;長沙創微智科&#xff09;博文大全&#xff1a;開發技術集合&#xff08;包含Qt實用技術、樹莓派、三維、OpenCV…

mysql 連接出現 Public Key Retrieval is not allowed

在MySQL連接中出現“Public Key Retrieval is not allowed”錯誤&#xff0c;通常是因為在使用安全套接字層&#xff08;SSL&#xff09;連接時遇到了問題。這是因為MySQL 8.0及以上版本對安全性要求更高&#xff0c;特別是在使用密碼插件如caching_sha2_password時&#xff0c…

【周末閑談】AI“搶飯碗”?絕對不是危言聳聽

AI是在幫助開發者還是取代他們? 在軟件開發領域,生成式人工智能(AIGC)正在改變開發者的工作方式。無論是代碼生成、錯誤檢測還是自動化測試,AI工具正在成為開發者的得力助手。然而,這也引發了對開發者職業前景和技能需求變化的討論。AI究竟是在幫助開發者還是取代他們?…

2024組裝一臺能跑AI大模型的電腦

title: 2024組裝一臺能跑AI大模型的電腦 tags: [組裝電腦, AI大模型] categories: [其他, 電腦, windows] 這里不寫組裝步驟&#xff0c;哪里接線&#xff0c;購買什么品牌網上一大堆。 這里只寫如何根據你自己的需求&#xff0c;選擇合適的、兼容的配件。 概述 需求&#xff…