前言
本文主要講解不同場景下分布式事務的解決方案,以及區別和相關理論,(部分圖片來自網路)
一、分布式事務的相關理論
CAP理論:
- 一致性(Consistency)
- 可用性(Availability)
- 磁區容錯(Partition-tolerance)
一個分布式系統最多只能滿足以上的兩項,磁區容錯性是分布式系統必然需要面對和解決的問題,因此在一些大型互聯網公司都會把精力放在如何在C(一致性)和A(可用性)之間尋求平衡,
BASE理論
- 基本可用(Basically Available)
指分布式系統在出現不可預知故障的時候,允許損失部分可用性, - 軟狀態( Soft State)
指允許系統中的資料存在中間狀態,并認為該中間狀態的存在不會影響系統的整體可用性,即允許系統在不同節點的資料副本之間進行資料同步的程序存在延時, - 最終一致( Eventual Consistency)
強調的是所有的資料更新操作,在經過一段時間的同步之后,最終都能夠達到一個一致的狀態,因此,最終一致性的本質是需要系統保證最終資料能夠達到一致,而不需要實時保證系統資料的強一致性,
BASE理論即在整體可用的情況下,滿足最終一致性,BASE理論可以說是CAP理論的拓展,
二、分布式事務解決方案
1.跨庫事務(強一致性事務)
跨庫事務即在一個jvm內呼叫兩個資料庫,
XA是由X/Open組織提出的分布式事務的規范,主要定義了:
- (全域)事務管理器(Transaction Manager),承擔協調者(中間人transactionmanager)的身份
- (區域)資源管理器(Resource Manager),通常是資料源
- XA介面是雙向的系統介面,在事務管理器(Transaction Manager)以及一個或多個資源管理器(Resource Manager)之間形成通信橋梁,
JTA是XA協議在JAVA上上的實作,主要定義了:
- 事務管理器的介面javax.transaction.TransactionManager,定義了有關事務的開始、提交、撤回等操作,
- 滿足XA規范的資源定義介面javax.transaction.xa.XAResource,一種資源如果要支持JTA事務,就需要讓它的資源實作該XAResource介面,并實作該介面定義的兩階段提交相關的介面,
XA/JTA簡單來說就是一個兩階段提交協議,以下圖舉例,
- 準備階段:協調者(事務管理器Transaction Manager)詢問每個資料源(資源管理器 Resource Manager),事務管理器詢問訂單庫和庫存庫,資料是否準備好,是否可以提交,
- 執行階段:如果資料源都回復可以提交資料,則協調者會把每個資料源的資料提交,如果資料源因為資源不足(庫存不足)或網路連接失敗等情況,回復不可以提交,則協調者會把每個資料源的資料進行回滾,

常見的JTA實作Atomikos,TransactionEssentials,
2.跨JVM事務(柔性事務)
XA/JTA是強一致性事務,在分布式系統中體現為CP,雖然資料強一致,但在大型互聯網公司通常對AP與CP都有需求,此種方案明顯無法被使用, 大多數互聯網公司都采用基于BASE理論的柔性事務,兼顧AP與CP,2.1.可靠訊息最終一致性方案
可靠訊息最終一致性方案是基于訊息中間件的解決方案,
在確保訊息服務可用的前提下,由生產者預發送訊息給獨立訊息服務存盤到資料庫,之后執行業務邏輯,執行完之后向訊息服務發送確定發送訊息,獨立訊息服務將此訊息發送到訊息佇列中,此時訊息消費者,在保證冪等性的前提下,消費訊息,消費成功后并手動ack,如果在確認發送訊息或ack因網路等原因,一直無法執行時,獨立訊息服務可以通過定時器,定時去相應服務查詢相關資料的狀態,進行自動確認發送和自動ack,

例子如下:

獨立訊息服務定時任務的作用就是解決例外情況下,訊息無法發送和消費成功無ACK的情況,但是如果訊息消費的程序中出現了例外情況,且多次重試都無法成功的情況下,就需要人工干預,
2.2.TCC(Try-Confirm-Cancel)兩階段補償型方案

累了,TCC(Try-Confirm-Cancel)就不再贅述了,T指資源預留,C資源確認,C資源回滾,
如下單,通常情況下只用寫一個介面,使用TCC方案下,需要寫三個介面,一個是資源預留介面,資源預留通常新增資料庫欄位控制,一個是資源預留成功情況下的資源確定介面,一個是資源預留失敗情況下的資源回滾介面,
TCC開源框架實作:
Atomikos,tcc-transaction,ByteTcc
3.TCC與XA/JTA的對比
- XA是資源層面的分布式事務,強一致性,在兩階段提交的整個程序中,一直會持有資源的鎖
- TCC是業務層面的分布式事務,最終一致性,不會一直持有資源的鎖

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/250656.html
標籤:其他
下一篇:框架3 Spring Boot
