Seata是SpringCloud Alibaba開發出的一款開源的分散式事務解決方案,致力於提供高性能和簡單易用的分散式事務服務。Seata 將為用戶提供了 AT 、TCC 、SAGA 和 XA 事務模式,為用戶打造一站式的分散式解決方案。可以很好的解決分散式系統中事務的問題。Seata的主要特點... ...
分散式事務——Seata
分散式事務
1. 本地事務與分散式事務
1.1 本地事務
本地事務,也就是傳統的單機事務。在傳統資料庫事務中,必須要滿足四個原則:
1.2 分散式事務問題
分散式事務,就是指不是在單個服務或單個資料庫架構下,產生的事務,例如:
- 跨數據源的分散式事務
- 跨服務的分散式事務
- 綜合情況
在資料庫水平拆分、服務垂直拆分之後,一個業務操作通常要跨多個資料庫、服務才能完成。例如電商行業中比較常見的下單付款案例,包括下麵幾個行為:
- 創建新訂單
- 扣減商品庫存
- 從用戶賬戶餘額扣除金額
完成上面的操作需要訪問三個不同的微服務和三個不同的資料庫。
訂單的創建、庫存的扣減、賬戶扣款在每一個服務和資料庫內是一個本地事務,可以保證ACID原則。
但是當我們把三件事情看做一個"業務",要滿足保證“業務”的原子性,要麼所有操作全部成功,要麼全部失敗,不允許出現部分成功部分失敗的現象,這就是分散式系統下的事務了。
此時ACID難以滿足,這是分散式事務要解決的問題
2. 分散式事務解決理論
解決分散式事務問題,需要一些分散式系統的基礎知識作為理論指導。
2.1.CAP定理
CAP定理是說在P一定會出現的情況下,A和C之間只能實現一個
1998年,加州大學的電腦科學家 Eric Brewer 提出,分散式系統有三個指標。
- Consistency(一致性)
- Availability(可用性)
- Partition tolerance (分區容錯性)
它們的第一個字母分別是 C、A、P。
Eric Brewer 說,這三個指標不可能同時做到。這個結論就叫做 CAP 定理。
2.1.1. C:一致性
Consistency(一致性):用戶訪問分散式系統中的任意節點,得到的數據必須一致。
比如現在包含兩個節點,其中的初始數據是一致的;當我們修改其中一個節點的數據時,兩者的數據產生了差異;要想保住一致性,就必須實現node01 到 node02的數據 同步:
2.1.2. A:可用性
Availability (可用性):用戶訪問集群中的任意健康節點,必須能得到響應,而不是超時或拒絕。
如圖,有三個節點的集群,訪問任何一個都可以及時得到響應:
當有部分節點因為網路故障或其它原因無法訪問時,代表節點不可用:
2.1.3. P:分區容錯
Partition(分區):因為網路故障或其它原因導致分散式系統中的部分節點與其它節點失去連接,形成獨立分區。
Tolerance(容錯):在集群出現分區時,整個系統也要持續對外提供服務
2.1.4. 矛盾
在分散式系統中,系統間的網路不能100%保證健康,一定會有故障的時候,而服務有必須對外保證服務。因此Partition Tolerance不可避免。
當節點接收到新的數據變更時,就會出現問題了:
如果此時要保證一致性,就必須等待網路恢復,完成數據同步後,整個集群才對外提供服務,服務處於阻塞狀態,不可用。
如果此時要保證可用性,就不能等待網路恢復,那node01、node02與node03之間就會出現數據不一致。
也就是說,在P一定會出現的情況下,A和C之間只能實現一個。
2.2.BASE理論
BASE理論是對CAP的一種解決思路,包含三個思想:
- Basically Available (基本可用):分散式系統在出現故障時,允許損失部分可用性,即保證核心可用。
- Soft State(軟狀態):在一定時間內,允許出現中間狀態,比如臨時的不一致狀態。
- Eventually Consistent(最終一致性):雖然無法保證強一致性,但是在軟狀態結束後,最終達到數據一致。
2.3.解決分散式事務的思路
分散式事務最大的問題是各個子事務的一致性問題,因此可以借鑒CAP定理和BASE理論,有兩種解決思路:
-
AP模式:各子事務分別執行和提交,允許出現結果不一致,然後採用彌補措施恢複數據即可,實現最終一致。
-
CP模式:各個子事務執行後互相等待,同時提交,同時回滾,達成強一致。但事務等待過程中,處於弱可用狀態。
小知識:ES就是使用了AP模式。當有節點宕機時就會斷開此節點,並將之前在此節點備份好的數據錄入其他節點
但不管是哪一種模式,都需要在子系統事務之間互相通訊,協調事務狀態,也就是需要一個事務協調者(TC):
這裡的子系統事務,稱為分支事務;有關聯的各個分支事務在一起稱為全局事務。
Seata
Seata是 2019 年 1 月份螞蟻金服和阿裡巴巴共同開源的分散式事務解決方案。致力於提供高性能和簡單易用的分散式事務服務,為用戶打造一站式的分散式解決方案。
官網地址:http://seata.io/,其中的文檔、播客中提供了大量的使用說明、源碼分析。
1. Seata的架構
Seata事務管理中有三個重要的角色:
-
TC (Transaction Coordinator) - 事務協調者:維護全局和分支事務的狀態,協調全局事務提交或回滾。
-
TM (Transaction Manager) - 事務管理器:定義全局事務的範圍、開始全局事務、提交或回滾全局事務。
-
RM (Resource Manager) - 資源管理器:管理分支事務處理的資源,與TC交談以註冊分支事務和報告分支事務的狀態,並驅動分支事務提交或回滾。
整體的架構如圖:
Seata基於上述架構提供了四種不同的分散式事務解決方案:
- XA模式:強一致性分階段事務模式,犧牲了一定的可用性,無業務侵入
- AT模式:最終一致的分階段事務模式,無業務侵入,也是Seata的預設模式
- TCC模式:最終一致的分階段事務模式,有業務侵入
- SAGA模式:長事務模式,有業務侵入
無論哪種方案,都離不開TC,也就是事務的協調者。
2. 部署TC服務
就是把Seata註冊到nacos中
2.1 下載
首先我們要下載seata-server包,地址在http