分布式事務與解決方案

一、什么是分布式事務

首先我們知道本地事務是指事務方法中的操作只依賴本地數據庫,可保證事務的ACID特性。而在分布式系統中,一個應用系統被拆分為多個可獨立部署的微服務,在一個微服務的事務方法中,除了依賴本地數據庫外,還可能會調用一個或多個遠程服務操作遠程數據庫,這種就叫做分布式事務。

在分布式事務中,如果由于網絡波動導致遠程調用執行成功了,但是沒有及時返回結果,導致事務回滾,本地數據庫回滾了,但是遠程數據庫已經執行成功持久化了,這就出現了不一致的情況。

二、Base理論

在CAP理論中的一致性強調的是強一致性。
BASE 是 Basically Available(基本可用)、Soft state(軟狀態)和 Eventually consistent (最終一致性)三個短語的縮
寫。BASE理論是對CAP中AP的一個擴展,通過犧牲強一致性來獲得可用性,當出現故障允許部分不可用但要保證
核心功能可用,允許數據在一段時間內是不一致的,但最終達到一致狀態。滿足BASE理論的事務,我們稱之為“柔
性事務”。

  • 基本可用:分布式系統在出現故障時,允許損失部分可用功能,保證核心功能可用。如,電商網站交易付款出
    現問題了,商品依然可以正常瀏覽。
  • 軟狀態:由于不要求強一致性,所以BASE允許系統中存在中間狀態(也叫軟狀態),這個狀態不影響系統可用
    性,如訂單的"支付中"、“數據同步中”等狀態,待數據最終一致后狀態改為“成功”狀態。
  • 最終一致性:最終一致是指經過一段時間后,所有節點數據都將會達到一致。如訂單的"支付中"狀態,最終會變
    為“支付成功”或者"支付失敗",使訂單狀態與實際交易結果達成一致,但需要一定時間的延遲、等待。

前面已經學習了分布式事務的基礎理論,以理論為基礎,針對不同的分布式場景業界常見的解決方案有2PC、可靠消息最終一致性、最大努力通知這幾種。

三、2PC —— 兩階段提交

  • P 準備階段:事務管理器給每個參與者發送Prepare消息,每個數據庫參與者在本地執行事務,并寫本地的Undo/Redo日志,但是先不提交事務,然后給事務管理器回復一個OK,表示準備好了。(Undo日志是記錄修改前的數據,用于數據庫回滾,Redo日志是記錄修改后的數據,用于提交事務后寫入數據文件)

  • C 提交階段:如果所有參與者都準備好了,事務管理器就會發送一個commit消息,所有參與者再執行事務提交。如果事務管理器收到了參與者的執行失敗或者超時消息時,直接給每個參與者發送回滾(Rollback)消息,所有參與者就都執行回滾。

成功情況:
在這里插入圖片描述

失敗情況:
在這里插入圖片描述

1. XA模式 —— 強一致性

XA模式流程就如上所說,第一階段參與者只執行不提交事務,第二階段收到Commit信號后再進行提交。這種模式可以基于數據庫的XA協議來實現。也可以基于一些第三方框架實現,比如Seata,Seata是由阿里中間件團隊做的一個是開源的分布式事務框架。它是工作在應用層,不需要數據庫支持XA協議,因此兼容性更好。它由事務協調器、事務管理器、資源管理器三部分組成:

  • Transaction Coordinator (TC): 事務協調器,它是獨立的中間件,需要獨立部署運行,它維護全局事務的運行狀態,接收TM指令發起全局事務的提交與回滾,負責與RM通信協調各各分支事務的提交或回滾。
  • Transaction Manager(TM): 事務管理器,TM需要嵌入應用程序中工作,它負責開啟一個全局事務,并最終向TC發起全局提交或全局回滾的指令。
  • Resource Manager (RM): 資源管理器,控制分支事務,負責分支注冊、狀態匯報,并接收事務協調器TC的指令,驅動分支(本地)事務的提交和回滾。

Seata的XA模式流程如下:

  • 一階段:TM開啟全局事務注冊到TC 、TM調用分支RM、RM將分支事務注冊到TC、RM執行SQL(但不提交!)、RM將執行狀態報告給TC

  • 二階段:TM通知提交全局事務、TC檢查各分支事務狀態,如果都成功,則通知RM提交。如果失敗,則通知RM回滾。

XA模式優缺點:XA模式保證了強一致性,但是資源鎖需要等到兩個階段結束才釋放,性能較差。

2. AT模式 —— 弱一致性

AT模式是Seata中的默認模式

  • 一階段:TM開啟全局事務注冊到TC、TM調用分支RM、RM將分支事務注冊到TC、RM記錄undolog日志、RM提交事務、TCC記錄各分支狀態

  • 二階段:TM通知提交全局事務、TC檢查各分支事務狀態,都成功則刪除undolog日志,有失敗則通知所有RM根據undolog日志執行反向補償操作回滾。

AT模式優缺點:AT模式在第一階段就提交了事務釋放了資源鎖,性能較高。但是由于提前提交了事務,如果在回滾之前,有其它事務修改了數據,那么再根據undolog日志回滾后就會覆蓋掉了這個修改,出現臟寫問題。需要引入全局鎖解決。

3. TCC模式 —— 弱一致性

TCC模式分為Try、Confirm和Cancel三個操作

  • 一階段:通過Try操作判斷是否有可用數據,有則鎖住需要的資源。
  • 二階段:如果全部try成功則執行confirm操作,完成資源的操作業務,且try成功confirm一定要成功,無論是通過重試還是人工介入。如果有try失敗的,則所有try成功的節點執行Cancel操作釋放預留資源。

TCC模式優缺點: try、confirm、canel需要人工手寫,而且需要考慮冪等性、空回滾、懸掛判斷,較為復雜、性能最好,但成本太高。

冪等性: try、confirm、canel這三個接口,要保證重試操作具有冪等性
空回滾:沒有執行try操作的節點回滾時執行了cancel。解決方案:用一張“分支事務記錄”記錄是否執行過try操作,執行cancel時要進行查詢,執行過try操作才需要回滾。
懸掛:try操作由于網絡波動超時了,導致觸發回滾cancel操作,在執行完cancel后try操作請求到達了,這種先cancel再try的現象就稱為懸掛。解決方案:在執行一階段事務時判斷在該全局事務下,“分支事務記錄”表中是否已經有二階段事務記錄,如果有則不執行Try。

在這里插入圖片描述

參考:

  1. https://blog.csdn.net/m0_58600248/article/details/126271252
  2. https://blog.csdn.net/O_Dentist/article/details/130966668

四、可靠消息最終一致性

可靠消息最終一致性方案是通過消息中間件完成的,指當事務發起方執行完成本地事務后并發出一條消息,事務參與方(消息消費者)一定能
夠接收消息并處理事務成功,使得所有事務參與方最終事務達到一致。

要達成這種效果需要解決以下問題:

  1. 原子性:本地事務和消息發送必須同時成功或者同時失敗,具有原子性。
  2. 可靠性:事務參與方必須能夠在消息隊列接收到消息,接收失敗可以重復接收。
  3. 冪等性: 事務參與方不能重復消費消息。

1. 本地消息表

本地數據庫增加一個消息表,將本地事務操作和添加消息記錄放在同一個事務中,然后后臺定時任務去循環掃描這個消息表,檢測到未發送的消息時就交給MQ發送,消費端收到這個消息后通過MQ回復ACK確認,發送端收到MQ反饋后再刪除對應的消息記錄,消費端要對收到的消息進行冪等性檢查避免重復消費(發送端可能會重復發送),非重復消費則消費執行事務。
在這里插入圖片描述

2. RocketMQ事務消息方案

  1. 在執行事務前會先發消息給MQ服務端,但是這個消息是不可消費狀態。
  2. 然后發送方再執行本地事務,執行成功/失敗后再給MQ服務端發送一個commit或者rollback事務確認消息,如果執行成功了MQ服務端再把消息投遞給訂閱方,如果執行失敗了則直接丟棄原來的消息。
  3. 如果確認消息在中間丟失了,MQ服務端沒有收到 則會定期回查事務的狀態。
    在這里插入圖片描述

在RocketMQ 4.3后實現了完整的事務消息,實際上其實是對本地消息表的一個封裝,將本地消息表移動到了MQ 內部,解決 Producer 端的消息發送與本地事務執行的原子性問題。

五、最大努力通知

發起通知方通過一定的機制最大努力將業務處理結果通知到接收方,比如重復通知,并且發送方要提供消息校對接口,若盡最大努力仍沒有通知到,此時可由接收方主動向通知方查詢消息信息來滿足需求。

1. MQ最大努力通知實現方案

  • 發送方通過MQ將消息發送出去。接收方收到后會回復一個ack,發送方收到ack則通知成功了。
  • 若發送方沒有收到ack,則進行重傳,直到超過一定次數。
  • 接收方可主動通過發送方提供的接口進行消息校對,獲取需要的消息。
    在這里插入圖片描述

參考:https://www.bilibili.com/video/BV1Q4411y7ip

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

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

相關文章

【深入理解ES6】塊級作用域綁定

1. var聲明及變量提升機制 提升(Hoisting)機制:通過關鍵字var聲明的變量,都會被當成在當前作用域頂部生命的變量。 function getValue(condition){if(condition){var value "blue";console.log(value);}else{// 此處…

代碼隨想錄算法訓練營第三十六天 | 435. 無重疊區間,763.劃分字母區間,56. 合并區間

代碼隨想錄算法訓練營第三十六天 | 435. 無重疊區間,763.劃分字母區間,56. 合并區間 435. 無重疊區間:eyes:題目總結:eyes: 763.劃分字母區間:eyes:題目總結:eyes: 56. 合并區間:eyes:題目總結:eyes: 435. 無重疊區間 題目鏈接 視頻講解 給定一個區間的…

并發編程系列-Semaphore

Semaphore,如今通常被翻譯為"信號量",過去也曾被翻譯為"信號燈",因為類似于現實生活中的紅綠燈,車輛是否能通行取決于是否是綠燈。同樣,在編程世界中,線程是否能執行取決于信號量是否允…

8.10 用redis實現緩存功能和Spring Cache

什么是緩存? 緩存(Cache), 就是數據交換的緩沖區,俗稱的緩存就是緩沖區內的數據,一般從數據庫中獲取,存儲于本地代碼。 通過Redis來緩存數據,減少數據庫查詢操作; 邏輯 每個分類的菜品保存一份緩存數據 數據庫菜品數據有變更時清理緩存數據 如何將商品數據緩存起…

p-級數的上界(Upper bound of p-series)

積分判別法-The Integral Test https://math.stackexchange.com/questions/2858067/upper-bound-of-p-series https://courses.lumenlearning.com/calculus2/chapter/the-p-series-and-estimating-series-value/ 兩個重要級數(p級數和幾何級數) ht…

WPF顯示初始界面--SplashScreen

WPF顯示初始界面–SplashScreen 前言 WPF應用程序的運行速度快,但并不能在瞬間啟動。當第一次啟動應用程序時,會有一些延遲,因為公共語言運行時(CLR)首先需要初始化.NET環境,然后啟動應用程序。 對于WPF中…

高憶管理:股票T+0交易是什么意思?t+0交易有什么好處?

股票的買賣準則有很多種,T0買賣便是其中之一。那么股票T0買賣是什么意思?t0買賣有什么優點?高憶管理也為大家預備了相關內容,以供參考。 股票T0買賣是什么意思? T0買賣準則是指出資者當天買入的股票能夠在當天賣出&am…

IP 多播協議(IP Multicast Protocol)

IP 多播協議(IP Multicast Protocol)是一種在網絡中一對多傳輸數據的通信方式。在傳統的單播通信中,數據從一個發送方發送到一個接收方;而在多播通信中,數據可以從一個發送方傳輸到多個接收方,從而有效地節…

SpringBoot 異步、郵件任務

異步任務 創建一個Hello項目 創建一個類AsyncService 異步處理還是非常常用的,比如我們在網站上發送郵件,后臺會去發送郵件,此時前臺會造成響應不動,直到郵件發送完畢,響應才會成功,所以我們一般會采用多線…

神經網絡基礎-神經網絡補充概念-03-邏輯回歸損失函數

概念 邏輯回歸使用的損失函數通常是"對數損失"(也稱為"交叉熵損失")或"邏輯損失"。這些損失函數在訓練過程中用于衡量模型預測與實際標簽之間的差異,從而幫助模型逐步調整權重參數,以更好地擬合數…

指靜脈開集測試(OpenSet-test)代碼(包含7個數據集)

七個數據集:sdu、mmc、hkpu、scut、utfvp、vera、nupt 一、SDU 80%用于訓練,20%用于作為開集測試 1.數據集分割代碼 ①先把636個類別提取出來 func: 創建temp_sdu,將636個類劃分出來。下一個代碼塊將進行openset_sdu的分割import os from shutil import copy, rmtre…

c++--SLT六大組件之間的關系

1.SLT六大組件: 容器,迭代器,算法,仿函數,適配器,空間配置器 2.六大組件之間的關系 容器:容器是STL最基礎的組件,沒有容器,就沒有數據,容器的作用就是用來存…

IO流 詳細介紹

一、IO流概述 1.IO:輸入(Input讀取數據)/輸出(Output寫數據) 2.流:是一種抽象概念,是對數據傳輸的總稱,也就是說數據在設備間的傳輸稱為流,流的本質是數據傳輸IO流就是用來處理設備間數據傳輸問題的。 3.常見的應用&#xff1a…

【Sklearn】基于隨機森林算法的數據分類預測(Excel可直接替換數據)

【Sklearn】基于隨機森林算法的數據分類預測(Excel可直接替換數據) 1.模型原理1.1 模型原理1.2 數學模型2.模型參數3.文件結構4.Excel數據5.下載地址6.完整代碼7.運行結果1.模型原理 隨機森林(Random Forest)是一種集成學習方法,通過組合多個決策樹來構建強大的分類或回歸…

JVM - 垃圾回收機制

JVM的垃圾回收機制(簡稱GC) JVM的垃圾回收機制非常強大,是JVM的一個很重要的功能,而且這也是跟對象實例息息相關的,如果對象實例不用了要怎么清除呢? 如何判斷對象已經沒用了 當JVM認為一個對像已經沒用了,就會把這個…

初識Sentinel

目錄 1.解決雪崩的方式有4種: 1.1.2超時處理: 1.1.3倉壁模式 1.1.4.斷路器 1.1.5.限流 1.1.6.總結 1.2.服務保護技術對比 1.3.Sentinel介紹和安裝 1.3.1.初識Sentinel 1.3.2.安裝Sentinel 1.4.微服務整合Sentinel 2.流量控制 2.1.簇點鏈路 …

Ubuntu中怎么清空mysql數據

要清空 MySQL 數據,可以使用以下步驟來執行。請注意,這將會永久刪除數據庫中的所有數據,請謹慎操作,并在操作前備份重要數據。 登錄 MySQL: 打開終端,使用以下命令登錄到 MySQL 數據庫。根據情況&#xf…

黑馬項目一階段面試58題 Web14題(一)

一、什么是AJAX 異步的JavaScript和XML。用來做前端和后端的異步請求的技術。 異步請求:只更新部分前端界面的請求,做到局部更新。 比如注冊,提示用戶名已存在而整個頁面沒有動 比如百度圖片搜索美女,進度條越變越短&#xff…

== 和 equals 的對比 [面試題]

和 equals 的對比[面試題] 文章目錄 和 equals 的對比[面試題]1. 和 equals 簡介2. Object 類中 equals() 源碼3. String 類中 equals() 源碼4. Integer 類中 equals() 源碼5. 如何重寫 equals 方法 1. 和 equals 簡介 是一個比較運算符 :既可以判斷基本數據類型…

【數據結構OJ題】鏈表的回文結構

原題鏈接:https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId49&&tqId29370&rp1&ru/activity/oj&qru/ta/2016test/question-ranking 目錄 1. 題目描述 2. 思路分析 3. 代碼實現 1. 題目描述 2. 思路分析 在做這道…