一、分布式事務解決方案
學習目标 :
- 了解本地事務與分布式事務
- 了解CAP理論與BASE理論
- 了解常見分布式事務解決方案
- 能夠通過Seata實作分布式事務
本地事務
起初,事務僅限于對單一資料庫資源的通路控制,架構服務化以後,事務的概念延伸到了服務中。倘若将
一個單一的服務操作作為一個事務,那麼整個服務操作隻能涉及一個單一的資料庫資源,這類基于單個服
務單一資料庫資源通路的事務,被稱為本地事務(Local Transaction)。
分布式事務
分布式事務指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分别位于不同的分布式系
統的不同節點之上,且屬于不同的應用,分布式事務需要保證這些操作要麼全部成功,要麼全部失敗。本
質上來說,分布式事務就是為了保證不同資料庫的資料一緻性。
最早的分布式事務應用架構很簡單,不涉及服務間的通路調用,僅僅是服務内操作涉及到對多個資料庫
資源的通路
當一個服務操作通路不同的資料庫資源,又希望對它們的通路具有事務特性時,就需要采用分布式事務
來協調所有的事務參與者。
對于上面介紹的分布式事務應用架構,盡管一個服務操作會通路多個資料庫資源,但是畢竟整個事務還
是控制在單一服務的内部。如果一個服務操作需要調用另外一個服務,這時的事務就需要跨越多個服務
了。在這種情況下,起始于某個服務的事務在調用另外一個服務的時候,需要以某種機制流轉到另外一
個服務,進而使被調用的服務通路的資源也自動加入到該事務當中來。下圖反映了這樣一個跨越多個服
務的分布式事務:
1.2 分布式事務相關理論
1.2.1 CAP定理
CAP 定理是在 1998年加州大學的計算機科學家 Eric Brewer (埃裡克.布魯爾)提出,分布式系統有三
個名額
Consistency 一緻性
Availability 可用性
Partition tolerance 分區容錯性
它們的第一個字母分别是 C、A、P。Eric Brewer 說,這三個名額不可能同時做到。這個結論就叫做
CAP 定理。
分區容錯 Partition tolerance
大多數分布式系統都分布在多個子網絡。每個子網絡就叫做一個區( partition)。分區容錯的意思是,
區間通信可能失敗。比如,一台伺服器放在中國,另一台伺服器放在美國,這就是兩個區,它們之間可
能無法通信。
上圖中, G1 和 G2 是兩台跨區的伺服器。G1 向 G2 發送一條消息,G2 可能無法收到。系統設計的時
候,必須考慮到這種情況。
一般來說,分區容錯無法避免,是以可以認為 CAP 的 P 總是成立。CAP 定理告訴我們,剩下的 C 和 A
無法同時做到。
可用性 Availability
Availability 中文叫做"可用性",意思是隻要收到使用者的請求,伺服器就必須給出回應。
使用者可以選擇向 G1 或 G2 發起讀操作。不管是哪台伺服器,隻要收到請求,就必須告訴使用者,到底是
v0 還是 v1,否則就不滿足可用性。
一緻性 Consistency
Consistency 中文叫做"一緻性"。意思是,寫操作之後的讀操作,必須傳回該值。
舉例來說,某條記錄是 v0,使用者向 G1 發起一個寫操作,将其改為 v1。
問題是,使用者有可能向 G2 發起讀操作,由于 G2 的值沒有發生變化,是以傳回的是 v0。G1 和 G2 讀
操作的結果不一緻,這就不滿足一緻性了。
為了讓 G2 也能變為 v1,就要在 G1 寫操作的時候,讓 G1 向 G2 發送一條消息,要求 G2 也改成 v1。
一緻性和可用性的沖突
一緻性和可用性,為什麼不可能同時成立?答案很簡單,因為可能通信失敗(即出現分區容錯)。
如果保證 G2 的一緻性,那麼 G1 必須在寫操作時,鎖定 G2 的讀操作和寫操作。隻有資料同步後,才
能重新開放讀寫。鎖定期間,G2 不能讀寫,沒有可用性。
如果保證 G2 的可用性,那麼勢必不能鎖定 G2,是以一緻性不成立。
綜上所述,G2 無法同時做到一緻性和可用性。系統設計時隻能選擇一個目标。如果追求一緻性,那麼
無法保證所有節點的可用性;如果追求所有節點的可用性,那就沒法做到一緻性。
1.2.2 BASE理論
BASE:全稱:Basically Available(基本可用),Soft state(軟狀态),和 Eventually consistent(最終一
緻性)三個短語的縮寫,來自 ebay 的架構師提出。BASE 理論是對 CAP 中一緻性和可用性權衡的結
果,其來源于對大型網際網路分布式實踐的總結,是基于 CAP 定理逐漸演化而來的。其核心思想是:
既是無法做到強一緻性(Strong consistency),但每個應用都可以根據自身的業務特點,采用
适當的方式來使系統達到最終一緻性(Eventual consistency)。
Basically Available(基本可用)
什麼是基本可用呢?假設系統,出現了不可預知的故障,但還是能用,相比較正常的系統而言:
-
響應時間上的損失:正常情況下的搜尋引擎 0.5 秒即傳回給使用者結果,而基本可用的搜尋引擎可以
在 1 秒作用傳回結果。
-
功能上的損失:在一個電商網站上,正常情況下,使用者可以順利完成每一筆訂單,但是到了大促期
間,為了保護購物系統的穩定性,部分消費者可能會被引導到一個降級頁面。
Soft state(軟狀态)
什麼是軟狀态呢?相對于原子性而言,要求多個節點的資料副本都是一緻的,這是一種 “硬狀态”。
軟狀态指的是:允許系統中的資料存在中間狀态,并認為該狀态不影響系統的整體可用性,即允許系統
在多個不同節點的資料副本存在資料延時。
Eventually consistent(最終一緻性)
系統能夠保證在沒有其他新的更新操作的情況下,資料最終一定能夠達到一緻的狀态,是以所有用戶端
對系統的資料通路最終都能夠擷取到最新的值。
消息最終一緻性
消息最終一緻性應該是業界使用最多的,其核心思想是将分布式事務拆分成本地事務進行處理,這種思
路是來源于ebay。我們可以從下面的流程圖中看出其中的一些細節: