隨着行業IT應用的業務複雜度提升、數據級日漸龐大、應用面越來越廣、併發壓力也越來越高。爲了應對這樣的情況,分佈式系統的解決方案隨之而出,成爲目前主流架構模式。當然,是否採用分佈式方案取決於實際業務系統要求。
分佈式系統涉及到的技術層面非常廣,本文只針對在規劃設計分佈式系統時會面臨到的分佈式事務問題採取的解決方案進行總體闡述。
分佈式系統架構
隨着行業業務及互聯網不斷的高速發展,業務的複雜度也越發更高,數據增長快、併發性能要求高,造成近年來大部分業務系統逐步轉化成採用分佈式架構。
對業務進行合理的、有前瞻性的服務化拆分規劃是目前所有大型系統採取的一個原則,而大型的系統技術架構也要基於該原則,面向服務化的系統架構設計要服務於業務規劃設計方案。
分佈式系統架構大概的模式
目前大部分大型WEB系統發展趨向都採用類似互聯網基於業務服務化進行架構設計模式,對業務進行深入拆分規劃、服務化等,微服務、SOA 等服務架構模式正在被大規模的使用。業務系統的服務部署也逐步採用各種主流的技術方案,例如虛擬化、Docker、雲託管等。
分佈式系統架構的採用、業務服務化和微服務的採用對於大型WEB系統可降低系統開發整體難度、提升系統開發迭代週期和效率等,也可以引入不同的技術棧協同開發,不同開發團隊同時協作開發。
這時產生了一個問題,業務系統的服務拆分的顆粒越細、越獨立,例如像現在很多大型平臺搭建各種業務中臺、技術中臺等,反而有時會使系統架構設計的複雜度變的更高,採用的技術底層處理框架會更復雜。從業務處理方面看,會帶來一個分佈式事務處理的問題,數據的一致性的解決複雜度會比以往單機系統更高。
什麼是事務
1. 事務的具體定義
事務提供一種機制將一個活動涉及的所有操作納入到一個不可分割的執行單元,組成事務的所有操作只有在所有操作均能正常執行的情況下方能提交,只要其中任一操作執行失敗,都將導致整個事務的回滾。
簡單地說,事務提供一種“要麼什麼都不做,要麼做全套”機制。
2. 事務的ACID
我們常說的ACID,特指結構化關係型數據庫的特性。
關係數據庫的ACID模型擁有:高一致性(C)和可用性(A), 很難進行分區(P)。
什麼是分佈式事務
百度百科:分佈式事務就是指事務的參與者、支持事務的服務器、資源服務器以及事務管理器分別位於不同的分佈式系統的不同節點之上。
簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分佈在不同的服務器上,且屬於不同的應用,分佈式事務需要保證這些小操作要麼全部成功,要麼全部失敗。
舉例:在電商平臺進行一次商品的採購就是一次分佈式事務,其中包括商品選擇、下單、庫存、付款、對接支付平臺、返回購買的結果等過程。
本質上來說,分佈式事務就是爲了保證不同數據庫的數據一致性。
分佈式事務的產生原因
1. 數據架構規劃或調整時進行分庫分表
在前期數據架構設計時或者到了一定的數據級別時,進行了分庫分表(垂直+水平)的操作,甚至進行深度調整改成分佈式數據服務,就必然會用到分佈式事務。如:某業務操作涉及訪問操作A數據庫、又訪問操作B數據庫庫,有可能兩個庫所存放的位置還不同,所以該業務操作必須訪問操作A、B庫成功後,纔算業務操作成功完成。
2. 業務服務化
由於業務系統的業務複雜度不斷提升,考慮併發高時系統穩定等,同時爲了方便團隊協作開發業務應用,目前大部分都是採用基於服務的架構體系,按業務情況進行拆分成大量獨立的服務或微服務,然後進行獨立部署。
後期實際業務訪問操作時會涉及到多個應用服務的調用,同時各個服務會針對自己業務的數據進行操作,爲了保證整個業務訪問過程涉及的數據一致性,就需要用到分佈式事務。
分佈式事務基礎理論
之前說過數據庫事務的 ACID 四大特性,已經無法支持分佈式事務。由於分佈式事務是來源於分佈式系統的,在設計分佈式系統時,業界主要有兩大理論:CAP和BASE。
1. CAP
CAP理論的定義很簡單,CAP三個字母分別代表了分佈式系統中三個相互矛盾的屬性:
Consistency (一致性):特指強一致性。
Availiablity(可用性):指系統在出現異常時已經可以提供服務
Toleranceto the partition of network (分區容忍):指系統可以對網絡分區這種異常情況進行容錯處理。
CAP理論指出:無法設計一種分佈式協議,使得同時完全具備CAP三個屬性,即
該種協議下的副本始終是強一致性
系統服務始終是可用的
協議可以容忍任何網絡分區異常
分佈式系統協議只能在CAP這三者間所有折中。CAP理論的詳細證明可以參考相關論文。
副本定義:(replica/copy)指在分佈式系統中爲數據或服務提供的冗餘。對於數據副本指在不同的節點上持久化同一份數據,當出現某一個節點的存儲的數據丟失時,可以從副本上讀到數據。
根據定理:任何分佈式系統只可同時滿足二點,沒法三者兼顧。所以設計分佈式應用系統的系統架構時,與傳統的非分佈式系統要有所區別,要根據實際業務場景及應用要求進行取捨,不要浪費精力在如何設計能滿足三者的完美分佈式系統上。
2. BASE
BASE思想可以說是CAP理論的進一步發展延伸。
BASE模型反ACID模型,完全不同ACID模型,犧牲高一致性(C),獲得可用性(A)或可靠性(P):
Basically Available:基本可用,支持分區失敗(例如:sharding碎片劃分數據庫)。
Soft state軟狀態:狀態可以有一段時間不同步,採取異步機制。
Eventually consistent:最終一致性。最終數據是一致的就可以了,而不是要求達到實時高一致。
目前大部分分佈式系統(例如互聯網平臺)多采用BASE思想指導設計及實現。
常見分佈式事務解決方案
1. 2PC(基於XA協議的兩階段提交)
XA是一個分佈式事務協議。XA中大致分爲兩部分:事務管理器和本地資源管理器。其中本地資源管理器往往由數據庫實現,比如Oracle、DB2這些商業數據庫都實現了XA接口,而事務管理器作爲全局的調度者,負責各個本地資源的提交和回滾。XA實現分佈式事務的原理如下:
總的來說,XA協議比較簡單,儘量保證了數據的強一致性,使用分佈式事務的成本也比較低,在各大主流數據庫都有自己實現,對於 MySQL 是從 5.5 開始支持。
但是,XA也有致命的缺點,那就是性能不理想, XA無法滿足高併發場景,不能支持高併發(由於同步阻塞)依然是其最大的弱點。
單點問題:事務管理器在整個流程中扮演的角色很關鍵,如果其宕機,比如在第一階段已經完成,在第二階段正準備提交的時候事務管理器宕機,資源管理器就會一直阻塞,導致數據庫無法使用。
同步阻塞:在準備就緒之後,資源管理器中的資源一直處於阻塞,直到提交完成,釋放資源。
數據不一致:兩階段提交協議雖然爲分佈式數據強一致性所設計,但仍然存在數據不一致性的可能。比如在第二階段中,假設協調者發出了事務 Commit 的通知,但是因爲網絡問題該通知僅被一部分參與者所收到並執行了 Commit 操作,其餘的參與者則因爲沒有收到通知一直處於阻塞狀態,這時候就產生了數據的不一致性。
2. TCC編程模式
所謂的TCC編程模式,也是兩階段提交的一個變種。TCC提供了一個編程框架,將整個業務邏輯分爲三塊:
Try 階段:嘗試執行,完成所有業務檢查(一致性),預留必需業務資源(準隔離性)。
Confirm 階段:確認真正執行業務,不作任何業務檢查,只使用 Try 階段預留的業務資源,Confirm 操作滿足冪等性。要求具備冪等設計,Confirm 失敗後需要進行重試。
Cancel 階段:取消執行,釋放 Try 階段預留的業務資源,Cancel 操作滿足冪等性。Cancel 階段的異常和 Confirm 階段異常處理方案基本上一致。
總之,TCC就是通過代碼人爲實現了兩階段提交,不同的業務場景所寫的代碼都不一樣,複雜度也不一樣,因此,這種模式並不能很好地被複用。
對於 TCC 來說適合一些:
強隔離性,嚴格一致性要求的活動業務。
執行時間較短的業務。
3. 消息事務
所謂的消息事務就是基於消息中間件的兩階段提交,本質上是對消息中間件的一種特殊利用,它是將本地事務和發消息放在了一個分佈式事務裏,保證要麼本地操作成功成功並且對外發消息成功,要麼兩者都失敗。如下例子:
在上圖中:
領域模型帶着邏輯和數據被分佈式緩存(例如如Redis),分佈到多臺機器中運行
當領域模型需要驅動架構功能時,調用消息服務層(消息隊列)進行驅動
同時通過分佈式事務和關係數據庫能夠保證持久數據一致性,不過模型中數據和關係數據庫中的數據一致性就不是高度實時的,但可實現最終一致
基於消息中間件的兩階段提交往往用在高併發場景下,犧牲了強一致性(實現最終一致性),換來了性能的大幅度提升。當然也是有風險的,如果等待消息驅動方一直執行不成功,那麼一致性會被破壞。具體採用不採用,還是要看業務實際情況。
總結
分佈式事務的解決思路,本質上是對多個數據庫的事務進行統一控制,按照控制力度可以分爲:
不控制:不引入分佈式事務
部分控制:各種變種的兩階段提交,包括上面提到的消息事務、TCC模式,好處是併發量和性能很好,缺點是數據一致性減弱了
完全控制:完全實現兩階段提交,完全控制則是犧牲了性能,保障了一致性
具體用哪種方式,最終還是取決於業務場景。作爲開發人員,一定不能忘了技術是爲業務服務的,不要爲了技術而技術。
通常情況下,能不用分佈式事務就不用,畢竟會提高系統技術架構的複雜度。如果非得使用的話,結合自己的業務分析,看看自己的業務比較適合哪一種,是在乎強一致,還是最終一致。
本文參考了分佈式系統原理等相關資料等。
作者:陳楚相