歡迎光臨
每天分享高質量文章

漫畫:什麼是分散式事務?

來自:程式員小灰(微訊號:chengxuyuanxiaohui)

—————  第二天  —————






————————————


假如沒有分散式事務


在一系列微服務系統當中,假如不存在分散式事務,會發生什麼呢?讓我們以網際網路中常用的交易業務為例子:

上圖中包含了庫存和訂單兩個獨立的微服務,每個微服務維護了自己的資料庫。在交易系統的業務邏輯中,一個商品在下單之前需要先呼叫庫存服務,進行扣除庫存,再呼叫訂單服務,建立訂單記錄。

正常情況下,兩個資料庫各自更新成功,兩邊資料維持著一致性。


但是,在非正常情況下,有可能庫存的扣減完成了,隨後的訂單記錄卻因為某些原因插入失敗。這個時候,兩邊資料就失去了應有的一致性。

什麼是分散式事務?


分散式事務用於在分散式系統中保證不同節點之間的資料一致性。分散式事務的實現有很多種,最具有代表性的是Oracle Tuxedo系統提出的XA分散式事務協議。


XA協議包含兩階段提交(2PC)三階段提交(3PC)兩種實現,這裡我們重點介紹兩階段提交的具體過程。

在魔獸世界這款遊戲中,副本組團打BOSS的時候,為了更方便隊長與隊員們之間的協作,隊長可以發起一個“就位確認”的操作:



當隊員收到就位確認提示後,如果已經就位,就選擇“是”,如果還沒就位,就選擇“否”



當隊長收到了所有人的就位確認,就會向所有隊員們釋出訊息,告訴他們開始打BOSS。



相應的,在隊長髮起就位確認的時候,有可能某些隊員還並沒有就位:





以上就是魔獸世界當中組團打BOSS的確認流程。這個流程和XA分散式事務協議的兩階段提交非常相似。


那麼XA協議究竟是什麼樣子呢?在XA協議中包含著兩個角色:事務協調者事務參與者。讓我們來看一看他們之間的互動流程:


第一階段:


在XA分散式事務的第一階段,作為事務協調者的節點會首先向所有的參與者節點傳送Prepare請求。


在接到Prepare請求之後,每一個參與者節點會各自執行與事務有關的資料更新,寫入Undo Log和Redo Log。如果參與者執行成功,暫時不提交事務,而是向事務協調節點傳回“完成”訊息。

當事務協調者接到了所有參與者的傳回訊息,整個分散式事務將會進入第二階段。



第二階段:



在XA分散式事務的第二階段,如果事務協調節點在之前所收到都是正向傳回,那麼它將會向所有事務參與者發出Commit請求。


接到Commit請求之後,事務參與者節點會各自進行本地的事務提交,並釋放鎖資源。當本地事務完成提交後,將會向事務協調者傳回“完成”訊息。


當事務協調者接收到所有事務參與者的“完成”反饋,整個分散式事務完成。



以上所描述的是XA兩階段提交的正向流程,接下來我們看一看失敗情況的處理流程:

第一階段:


第二階段:


在XA的第一階段,如果某個事務參與者反饋失敗訊息,說明該節點的本地事務執行不成功,必須回滾。


於是在第二階段,事務協調節點向所有的事務參與者傳送Abort請求。接收到Abort請求之後,各個事務參與者節點需要在本地進行事務的回滾操作,回滾操作依照Undo Log來進行。


以上就是XA兩階段提交協議的詳細過程。



XA兩階段提交的不足


XA兩階段提交究竟有哪些不足呢?


1.效能問題

XA協議遵循強一致性。在事務執行過程中,各個節點佔用著資料庫資源,只有當所有節點準備完畢,事務協調者才會通知提交,參與者提交後釋放資源。這樣的過程有著非常明顯的效能問題。

2.協調者單點故障問題

事務協調者是整個XA模型的核心,一旦事務協調者節點掛掉,參與者收不到提交或是回滾通知,參與者會一直處於中間狀態無法完成事務。


3.丟失訊息導致的不一致問題。

在XA協議的第二個階段,如果發生區域性網路問題,一部分事務參與者收到了提交訊息,另一部分事務參與者沒收到提交訊息,那麼就導致了節點之間資料的不一致。

如果避免XA兩階段提交的種種問題呢?有許多其他的分散式事務方案可供選擇:


1.XA三階段提交

XA三階段提交在兩階段提交的基礎上增加了CanCommit階段,並且引入了超時機制。一旦事物參與者遲遲沒有接到協調者的commit請求,會自動進行本地commit。這樣有效解決了協調者單點故障的問題。但是效能問題和不一致的問題仍然沒有根本解決。


2.MQ事務

利用訊息中介軟體來非同步完成事務的後一半更新,實現系統的最終一致性。這個方式避免了像XA協議那樣的效能問題。


3.TCC事務

TCC事務是Try、Commit、Cancel三種指令的縮寫,其邏輯樣式類似於XA兩階段提交,但是實現方式是在程式碼層面來人為實現。



幾點補充:


.本漫畫純屬娛樂,還請大家儘量珍惜當下的工作,切勿模仿小灰的行為哦。

—————END—————


系列文章:

漫畫:什麼是一致性雜湊?

漫畫:什麼是B+樹?

漫畫:什麼是B-樹?

漫畫:什麼是跳躍表?

漫畫:什麼是動態規劃?

漫畫:當程式猿遇上智力測試題

漫畫:判斷 2 的乘方

漫畫演演算法:最小棧的實現

漫畫:什麼是大資料?

漫畫演演算法:無序陣列排序後的最大相鄰差值

漫畫:什麼是Bitmap演演算法?

漫畫:Bitmap演演算法 進階篇

什麼是A*尋路演演算法?

漫畫:當程式員遇上智力題(第四季)

漫畫:什麼是Base64演演算法?

漫畫:什麼是MD5演演算法?

漫畫:如何破解MD5演演算法?

漫畫:什麼是SHA系列演演算法?

漫畫:什麼是AES演演算法?

漫畫:AES演演算法的底層原理

漫畫:什麼是紅黑樹?

漫畫:什麼是HashMap?

漫畫:高併發下的HashMap

漫畫:什麼是單例樣式?(整合版)

漫畫:什麼是架構師

漫畫:什麼是大資料?

漫畫:什麼是微服務?

漫畫: 什麼是人工智慧?

漫畫:什麼是資料倉庫?

漫畫:什麼是八皇后問題?

漫畫:什麼是MapReduce?

漫畫:什麼是區塊鏈?



●編號639,輸入編號直達本文

●輸入m獲取文章目錄

推薦↓↓↓

 

演演算法與資料結構

更多推薦18個技術類微信公眾號

涵蓋:程式人生、演演算法與資料結構、駭客技術與網路安全、大資料技術、前端開發、Java、Python、Web開發、安卓開發、iOS開發、C/C++、.NET、Linux、資料庫、運維等。

贊(0)

分享創造快樂