日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

阿里P8架构师谈:分布式事务的解决方案,以及原理、总结

發布時間:2024/7/5 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 阿里P8架构师谈:分布式事务的解决方案,以及原理、总结 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分布式事務是企業集成中的一個技術難點,也是每一個分布式系統架構中都會涉及到的一個東西,特別是在這幾年越來越火的微服務架構中,幾乎可以說是無法避免,本文就圍繞分布式事務各方面與大家進行介紹。

事務

1.1 什么是事務

數據庫事務(簡稱:事務,Transaction)是指數據庫執行過程中的一個邏輯單位,由一個有限的數據庫操作序列構成。

事務擁有以下四個特性,習慣上被稱為ACID特性:

  • 原子性(Atomicity):事務作為一個整體被執行,包含在其中的對數據庫的操作要么全部被執行,要么都不執行。
  • 一致性(Consistency):事務應確保數據庫的狀態從一個一致狀態轉變為另一個一致狀態。一致狀態是指數據庫中的數據應滿足完整性約束。除此之外,一致性還有另外一層語義,就是事務的中間狀態不能被觀察到(這層語義也有說應該屬于原子性)。
  • 隔離性(Isolation):多個事務并發執行時,一個事務的執行不應影響其他事務的執行,如同只有這一個操作在被數據庫所執行一樣。
  • 持久性(Durability):已被提交的事務對數據庫的修改應該永久保存在數據庫中。在事務結束時,此操作將不可逆轉。

1.2 本地事務

起初,事務僅限于對單一數據庫資源的訪問控制:

架構服務化以后,事務的概念延伸到了服務中。倘若將一個單一的服務操作作為一個事務,那么整個服務操作只能涉及一個單一的數據庫資源:

這類基于單個服務單一數據庫資源訪問的事務,被稱為本地事務(Local Transaction)。

分布式事務

本地事務主要限制在單個會話內,不涉及多個數據庫資源。但是在基于SOA(Service-Oriented Architecture,面向服務架構)的分布式應用環境下,越來越多的應用要求對多個數據庫資源,多個服務的訪問都能納入到同一個事務當中,分布式事務應運而生

最早的分布式事務應用架構很簡單,不涉及服務間的訪問調用,僅僅是服務內操作涉及到對多個數據庫資源的訪問。

當一個服務操作訪問不同的數據庫資源,又希望對它們的訪問具有事務特性時,就需要采用分布式事務來協調所有的事務參與者。

對于上面介紹的分布式事務應用架構,盡管一個服務操作會訪問多個數據庫資源,但是畢竟整個事務還是控制在單一服務的內部。如果一個服務操作需要調用另外一個服務,這時的事務就需要跨越多個服務了。在這種情況下,起始于某個服務的事務在調用另外一個服務的時候,需要以某種機制流轉到另外一個服務,從而使被調用的服務訪問的資源也自動加入到該事務當中來。下圖反映了這樣一個跨越多個服務的分布式事務:

如果將上面這兩種場景(一個服務可以調用多個數據庫資源,也可以調用其他服務)結合在一起,對此進行延伸,整個分布式事務的參與者將會組成如下圖所示的樹形拓撲結構。在一個跨服務的分布式事務中,事務的發起者和提交均系同一個,它可以是整個調用的客戶端,也可以是客戶端最先調用的那個服務。

較之基于單一數據庫資源訪問的本地事務,分布式事務的應用架構更為復雜。

在不同的分布式應用架構下,實現一個分布式事務要考慮的問題并不完全一樣,比如對多資源的協調、事務的跨服務傳播等,實現機制也是復雜多變。盡管有這么多工程細節需要考慮,但分布式事務最核心的還是其 ACID 特性。因此,想要了解一個分布式事務,就先從了解它是怎么實現事務 ACID 特性開始。

下文將從兩個最常見的分布式事務模型入手,著重分析分布式事務的基礎共通點,即如何保證分布式事務的 ACID 特性。

常見的分布式事務解決方案

1.基于XA協議的兩階段提交

XA是一個分布式事務協議,由Tuxedo提出。XA中大致分為兩部分:事務管理器和本地資源管理器。其中本地資源管理器往往由數據庫實現,比如Oracle、DB2這些商業數據庫都實現了XA接口,而事務管理器作為全局的調度者,負責各個本地資源的提交和回滾。XA實現分布式事務的原理如下:

總的來說,XA協議比較簡單,而且一旦商業數據庫實現了XA協議,使用分布式事務的成本也比較低。但是,XA也有致命的缺點,那就是性能不理想,特別是在交易下單鏈路,往往并發量很高,XA無法滿足高并發場景。XA目前在商業數據庫支持的比較理想,在mysql數據庫中支持的不太理想,mysql的XA實現,沒有記錄prepare階段日志,主備切換回導致主庫與備庫數據不一致。許多nosql也沒有支持XA,這讓XA的應用場景變得非常狹隘。

2.消息事務+最終一致性

所謂的消息事務就是基于消息中間件的兩階段提交,本質上是對消息中間件的一種特殊利用,它是將本地事務和發消息放在了一個分布式事務里,保證要么本地操作成功成功并且對外發消息成功,要么兩者都失敗,開源的RocketMQ就支持這一特性,具體原理如下:

1、A系統向消息中間件發送一條預備消息

2、消息中間件保存預備消息并返回成功

3、A執行本地事務

4、A發送提交消息給消息中間件

通過以上4步完成了一個消息事務。對于以上的4個步驟,每個步驟都可能產生錯誤,下面一一分析:

  • 步驟一出錯,則整個事務失敗,不會執行A的本地操作
  • 步驟二出錯,則整個事務失敗,不會執行A的本地操作
  • 步驟三出錯,這時候需要回滾預備消息,怎么回滾?答案是A系統實現一個消息中間件的回調接口,消息中間件會去不斷執行回調接口,檢查A事務執行是否執行成功,如果失敗則回滾預備消息
  • 步驟四出錯,這時候A的本地事務是成功的,那么消息中間件要回滾A嗎?答案是不需要,其實通過回調接口,消息中間件能夠檢查到A執行成功了,這時候其實不需要A發提交消息了,消息中間件可以自己對消息進行提交,從而完成整個消息事務

基于消息中間件的兩階段提交往往用在高并發場景下,將一個分布式事務拆成一個消息事務(A系統的本地操作+發消息)+B系統的本地操作,其中B系統的操作由消息驅動,只要消息事務成功,那么A操作一定成功,消息也一定發出來了,這時候B會收到消息去執行本地操作,如果本地操作失敗,消息會重投,直到B操作成功,這樣就變相地實現了A與B的分布式事務。原理如下:

雖然上面的方案能夠完成A和B的操作,但是A和B并不是嚴格一致的,而是最終一致的,我們在這里犧牲了一致性,換來了性能的大幅度提升。當然,這種玩法也是有風險的,如果B一直執行不成功,那么一致性會被破壞,具體要不要玩,還是得看業務能夠承擔多少風險。

3.TCC 模型

TCC(Try-Confirm-Cancel)分布式事務模型相對于 XA 等傳統模型,其特征在于它不依賴資源管理器(RM)對分布式事務的支持,而是通過對業務邏輯的分解來實現分布式事務。

TCC 模型認為對于業務系統中一個特定的業務邏輯,其對外提供服務時,必須接受一些不確定性,即對業務邏輯初步操作的調用僅是一個臨時性操作,調用它的主業務服務保留了后續的取消權。如果主業務服務認為全局事務應該回滾,它會要求取消之前的臨時性操作,這就對應從業務服務的取消操作。而當主業務服務認為全局事務應該提交時,它會放棄之前臨時性操作的取消權,這對應從業務服務的確認操作。每一個初步操作,最終都會被確認或取消。

因此,針對一個具體的業務服務,TCC 分布式事務模型需要業務系統提供三段業務邏輯:

初步操作 Try:完成所有業務檢查,預留必須的業務資源。

確認操作 Confirm:真正執行的業務邏輯,不作任何業務檢查,只使用 Try 階段預留的業務資源。因此,只要 Try 操作成功,Confirm 必須能成功。另外,Confirm 操作需滿足冪等性,保證一筆分布式事務有且只能成功一次。

取消操作 Cancel:釋放 Try 階段預留的業務資源。同樣的,Cancel 操作也需要滿足冪等性。

TCC 分布式事務模型包括三部分

1.主業務服務:主業務服務為整個業務活動的發起方,服務的編排者,負責發起并完成整個業務活動。

2.從業務服務:從業務服務是整個業務活動的參與方,負責提供 TCC 業務操作,實現初步操作(Try)、確認操作(Confirm)、取消操作(Cancel)三個接口,供主業務服務調用。

3.業務活動管理器:業務活動管理器管理控制整個業務活動,包括記錄維護 TCC 全局事務的事務狀態和每個從業務服務的子事務狀態,并在業務活動提交時調用所有從業務服務的 Confirm 操作,在業務活動取消時調用所有從業務服務的 Cancel 操作。

一個完整的 TCC 分布式事務流程如下:

  • 主業務服務首先開啟本地事務;
  • 主業務服務向業務活動管理器申請啟動分布式事務主業務活動;
  • 然后針對要調用的從業務服務,主業務活動先向業務活動管理器注冊從業務活動,然后調用從業務服務的 Try 接口;
  • 當所有從業務服務的 Try 接口調用成功,主業務服務提交本地事務;若調用失敗,主業務服務回滾本地事務;
  • 若主業務服務提交本地事務,則 TCC 模型分別調用所有從業務服務的 Confirm 接口;若主業務服務回滾本地事務,則分別調用 Cancel 接口;
  • 所有從業務服務的 Confirm 或 Cancel 操作完成后,全局事務結束。
  • TCC模型小結

    所謂的TCC編程模式,也是兩階段提交的一個變種。TCC提供了一個編程框架,將整個業務邏輯分為三塊:Try、Confirm和Cancel三個操作。以在線下單為例,Try階段會去扣庫存,Confirm階段則是去更新訂單狀態,如果更新訂單失敗,則進入Cancel階段,會去恢復庫存。總之,TCC就是通過代碼人為實現了兩階段提交,不同的業務場景所寫的代碼都不一樣,復雜度也不一樣,因此,這種模式并不能很好地被復用。

    分布式事務總結

    分布式事務,本質上是對多個數據庫的事務進行統一控制,按照控制力度可以分為:不控制、部分控制和完全控制。不控制就是不引入分布式事務,部分控制就是各種變種的兩階段提交,包括上面提到的消息事務+最終一致性、TCC模式,而完全控制就是完全實現兩階段提交。部分控制的好處是并發量和性能很好,缺點是數據一致性減弱了,完全控制則是犧牲了性能,保障了一致性,具體用哪種方式,最終還是取決于業務場景。作為技術人員,一定不能忘了技術是為業務服務的,不要為了技術而技術,針對不同業務進行技術選型也是一種很重要的能力!

    你可能也喜歡:

  • 阿里P8架構師談:分布式Session共享的4類技術方案,與優劣勢比較
  • 阿里P8架構師談:分布式鎖的3種實現(數據庫、緩存、Zookeeper)
  • 阿里P8架構師談:分布式系統全局唯一ID簡介、特點、5種生成方式
  • 一篇文章徹底搞懂“分布式事務”
  • 阿里P8架構師談:單點登錄的原理、來源、實現、以及技術方案比較
  • 阿里P8架構師談:分布式數據庫數據一致性的原理、與技術實現方案

  • 總結

    以上是生活随笔為你收集整理的阿里P8架构师谈:分布式事务的解决方案,以及原理、总结的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。