深入理解分散式交易

來源:互聯網
上載者:User

轉載自:
部落格園

我在上一期介紹了spring的事務原理(詳情見《深入理解spring事務原理》),Spring事務本質是單機下的事務,是由資料庫本身保證的。今天,我將介紹一種比較複雜的事務:分散式交易。
1、什麼是分散式交易

分散式交易就是指事務的參與者、支援事務的伺服器、資原始伺服器以及交易管理員分別位於不同的分布式系統的不同節點之上。以上是百度百科的解釋,簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分布在不同的伺服器上,且屬於不同的應用,分散式交易需要保證這些小操作要麼全部成功,要麼全部失敗。本質上來說,分散式交易就是為了保證不同資料庫的資料一致性。
2、分散式交易的產生的原因
2.1、資料庫分庫分表

當資料庫單表一年產生的資料超過1000W,那麼就要考慮分庫分表,具體分庫分表的原理在此不做解釋,以後有空詳細說,簡單的說就是原來的一個資料庫變成了多個資料庫。這時候,如果一個操作既訪問01庫,又訪問02庫,而且要保證資料的一致性,那麼就要用到分散式交易。

2.2、應用SOA化

所謂的SOA化,就是業務的服務化。比如原來單機支撐了整個電商網站,現在對整個網站進行拆解,分離出了訂單中心、使用者中心、庫存中心。對於訂單中心,有專門的資料庫儲存訂單資訊,使用者中心也有專門的資料庫儲存使用者資訊,庫存中心也會有專門的資料庫存放庫存資訊。這時候如果要同時對訂單和庫存進行操作,那麼就會涉及到訂單資料庫和庫存資料庫,為了保證資料一致性,就需要用到分散式交易。

以上兩種情況表象不同,但是本質相同,都是因為要操作的資料庫變多了。
3、事務的ACID特性
3.1、原子性(A)

所謂的原子性就是說,在整個事務中的所有操作,要麼全部完成,要麼全部不做,沒有中間狀態。對於事務在執行中發生錯誤,所有的操作都會被復原,整個事務就像從沒被執行過一樣。
3.2、一致性(C)

事務的執行必須保證系統的一致性,就拿轉賬為例,A有500元,B有300元,如果在一個事務裡A成功轉給B50元,那麼不管並發多少,不管發生什麼,只要事務執行成功了,那麼最後A賬戶一定是450元,B賬戶一定是350元。
3.3、隔離性(I)

所謂的隔離性就是說,事務與事務之間不會互相影響,一個事務的中間狀態不會被其他事務感知。
3.4、持久性(D)

所謂的持久性,就是說一單事務完成了,那麼事務對資料所做的變更就完全儲存在了資料庫中,即使發生停電,系統宕機也是如此。
4、分散式交易的應用情境
4.1、支付

最經典的情境就是支付了,一筆支付,是對買家賬戶進行扣款,同時對賣家賬戶進行加錢,這些操作必須在一個事務裡執行,要麼全部成功,要麼全部失敗。而對於買家賬戶屬於買家中心,對應的是買家資料庫,而賣家賬戶屬於賣家中心,對應的是賣家資料庫,對不同資料庫的操作必然需要引入分散式交易。
4.2、線上下單

買家在電商平台下單,往往會涉及到兩個動作,一個是扣庫存,第二個是更新訂單狀態,庫存和訂單一般屬於不同的資料庫,需要使用分散式交易保證資料一致性。
5、常見的分散式交易解決方案
5.1、基於XA協議的兩階段交易認可

XA是一個分散式交易協議,由Tuxedo提出。XA中大致分為兩部分:交易管理員和本地資源管理員。其中本地資源管理員往往由資料庫實現,比如Oracle、DB2這些商務資料庫都實現了XA介面,而交易管理員作為全域的調度者,負責各個本地資源的提交和復原。XA實現分散式交易的原理如下:

總的來說,XA協議比較簡單,而且一旦商務資料庫實現了XA協議,使用分散式交易的成本也比較低。但是,XA也有致命的缺點,那就是效能不理想,特別是在交易下單鏈路,往往並發量很高,XA無法滿足高並發情境。XA目前在商務資料庫支援的比較理想,在mysql資料庫中支援的不太理想,mysql的XA實現,沒有記錄prepare階段日誌,主備切換回導致主庫與備庫資料不一致。許多nosql也沒有支援XA,這讓XA的應用情境變得非常狹隘。
5.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一直執行不成功,那麼一致性會被破壞,具體要不要玩,還是得看業務能夠承擔多少風險。
5.3、TCC編程模式

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

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.