漫談分散式事務的那些解決方案
事務我們都不陌生,我們常說的事務一般都是指單機事務,即本地事務。那分散式事務是什麼?分散式事務就是由多個本地事務組合而成的事務,一般在分散式場景下才會出現。
比如電商平臺中,我們在購物的時候,下單支付這個過程看上去是一氣呵成的,但是背後可能是多個系統的分工合作。訂單系統、支付系統、物流系統等。這些系統部署在不同的伺服器上,執行的都是各種的事務,對於電商平臺來說,這就是分散式事務。
本地事務都好解決,有一套現成的事務機制,分散式事務比本地事務就要複雜多。如何實現分散式事務呢?大概有 3 種解決方式:
- 基於 XA 協議的二階段提交協議。
- 三階段提交協議。
- 基於 MQ 的最終一致性。
基於 XA 協議的二階段提交
XA協議由 Tuxedo 首先提出的,並交給X/Open組織,作為資源管理器(資料庫)與事務管理器的介面標準。目前,Oracle、Informix、DB2和Sybase等各大資料庫廠家都提供對XA的支援。----來源百度百科
二階段提交也叫 2PC ,The two-phase commit protocol。首先在二階段提交中有兩個角色:
- 參與者:本地資源管理器,即事務的執行者,也就是各個業務系統。
- 協調者:分散式事務的大腦,負責指揮協調各個業務系統提交/回滾事務。
所謂得兩階段提交就是指投票(voting)和提交(commit) 兩個階段,跟選舉制度一樣,先投票,再決定。
投票階段,協調者向參與者發起執行事務操作的請求(CanCommit 請求),並等待參與者響應。
參與者接受到請求後,執行事務請求操作,記錄日誌資訊但不提交,記錄成功後,向協調者發生 “Yes” 訊息,表示同意提交操作,若不成功,則傳送“No” 訊息,表示不同意這次操作。注意這個過程會鎖定資料。
投票階段得流程圖,大概就是下面這樣子:
提交階段,協調者接受到所有參與者的響應之後,根據返回來的資訊情況,向參與者傳送提交或回滾請求。
-
若收到的響應訊息都是 “Yes”,則向參與者傳送 “DoCommit” 訊息,參與者完成本地事務的其他操作並釋放資源,然後向協調者傳送 “HaveCommitted”訊息;
-
如果協調者收到的訊息中包含“No”訊息或者在規定時間內有參與者沒有響應,則向所有參與者傳送“DoAbort”訊息,此時傳送“Yes”的參與者則會根據之前執行操作時的回滾日誌對操作進行回滾,然後所有參與者會向協調者傳送“HaveCommitted”訊息;
提交階段的流程,大概入下圖所示:
二階段提交協議容易理解,基於 XA 的二階段提交演算法滿足事務的 ACID 特性,看上去比較完美,但是缺點還是挺多的,主要有以下幾個問題:
- 同步阻塞問題:二階段提交在執行過程中,所有參與節點都是事務阻塞型的,參與者會鎖定資料,其他訪問者要訪問該資料的話,都會被阻塞。
- 單點故障問題。在二階段提交協議中,協調者只有一臺,一旦協調者傳送故障,整個系統都會處於停滯階段。特別是提交階段,如果協調者掛了的話,參與者就會一直等待協調者回應,會處於阻塞中。
- 資料不一致問題:在提交階段,協調者向參與者傳送 DoCommit 請求後,由於網路抖動或者在傳送請求的過程中,協調者發生故障,就會導致只有一部分參與者接收到了提交請求並執行提交操作,但其他未接到提交請求的那部分參與者則無法執行事務提交。於是整個分散式系統便出現了資料不一致的問題。
三階段提交
三階段提交協議(Three-phase commit protocol,3PC)是對二階段提交(2PC)的改進。解決了二階段提交的一些問題,三階段和二階段提交最大的不同是引入超時機制和準備階段。
先來說說超時機制,在二階段提交,只有協調者才有超時機制,如果協調者在規定時間內沒有接收到參與者的響應,就會根據當前狀態提交或者終止整個事務,但是如果協調者掛了,參與者並沒有超時機制,所以就一直等待,這也是二階段提交單點故障的問題。在三階段提交中,同時在協調者和參與者中引入超時機制。如果協調者或參與者在規定的時間內沒有接收到來自其他節點的響應,就會根據當前的狀態選擇提交或者終止整個事務。
三階段提交其實就是將二階段提交中的提交階段一分為二,三階段提交協議中的具體三階段是:CanCommit、PreCommit、DoCommit 三個階段
CanCommit 階段,CanCommit 階段與 2PC 的投票階段類似:協調者向參與者傳送請求操作(CanCommit 請求),詢問參與者是否可以執行事務提交操作,然後等待參與者的響應;參與者收到 CanCommit 請求之後,回覆 Yes,表示可以順利執行事務;否則回覆 No。
PreCommit 階段,根據二階段提交中的提交階段相似,根據 CanCommit 階段返回的結果,來決定是否可以進行 PreCommit 操作。
這時候就存在兩種情況,如果所有參與者都回復 “Yes”,那麼執行流程是這樣的:
- 1、協調者傳送預提交請求:協調者向參與者傳送 PreCommit 請求,進入預提交階段.
- 2、事務預提交:參與者接收到 PreCommit 請求後執行事務操作,並將 Undo 和 Redo 資訊記錄到事務日誌中。
- 3、響應反饋:如果參與者成功執行了事務操作,則返回 ACK 響應,同時開始等待最終指令。
如果有參與者返回 “No”,或者協調者在規定時間內沒有收到參與者的響應,那麼將執行中斷事務操作。流程是這樣的:
- 1、傳送中斷請求:協調者向所有參與者傳送“Abort”訊息。
- 2、中斷事務:參與者收到“Abort”訊息之後,或超時後仍未收到協調者的訊息,執行事務的中斷操作。
DoCommit 階段, 事務真正提交階段,協調者根據 PreCommit 階段參與者返回來的資訊,決定是進入提交階段還是事務中斷階段。
提交階段流程如下:
- 1、傳送提交請求:協調者接收到所有參與者傳送的 Ack 響應,從預提交狀態進入到提交狀態,並向所有參與者傳送 DoCommit 訊息。
- 2、事務提交:參與者接收到 DoCommit 訊息之後,正式提交事務。完成事務提交之後,釋放所有鎖住的資源。
- 3、響應反饋:參與者提交完事務之後,向協調者傳送 Ack 響應。
- 4、完成事務:協調者接收到所有參與者的 Ack 響應之後,完成事務。
事務中斷階段,流程如下:
- 1、傳送中斷請求:協調者向所有參與者傳送 Abort 請求。
- 2、事務回滾:參與者接收到 Abort 訊息之後,利用其在 PreCommit 階段記錄的 Undo 資訊執行事務的回滾操作,並釋放所有鎖住的資源。
- 3、反饋結果:參與者完成事務回滾之後,向協調者傳送 Ack 訊息。
- 4、中斷事務:協調者接收到參與者反饋的 Ack 訊息之後,執行事務的中斷,並結束事務。
基於分散式訊息的最終一致性方案
不管是二階段提交還是三階段提交,都屬於強一致性的,滿足事務的 ACID 原則。它們都有兩個共同的問題:
- 1、需要鎖定資料,降低了系統性能。
- 2、因為網路等原因,並沒有完全解決資料一致性問題。
而基於 MQ 訊息的分散式解決方案就不太一樣了,它採用的不是強一致性,而是最終一致性,這也就是 BASE 理論。並且我們直到 MQ 是非同步的,所以效能也比較快,可以說完美的解決了上面兩種方式帶來的問題。
基於 MQ 訊息中介軟體解決分散式事務的思路是這樣的:主要是基於 MQ 訊息投遞的可靠性,將分散式事務傳送給 MQ 中介軟體之後,中介軟體將事務持久化,這一點非常重要,保證訊息不丟失。消費者端非同步消費,如果遇到失敗情況,由於我們的訊息是持久化的,所以可以根據業務規則不斷重試,有必要的話,人工補償,保證資料最終一致性。
關於基於分散式訊息的最終一致性方案,我準備基於 RocketMQ 單獨開一個章節,詳細聊一聊,這裡就不多說了。
歡迎關注公眾號【網際網路平頭哥】。關注這個網際網路苟且偷生的程式設計師,願你我共同進步,今天最好的是明天最低的要求。
相關推薦
分散式事務與解決方案
分散式事務:分散式事務是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。 先來理解幾個概念:事物具有四大特性ACID,分散式系統無法同時滿足CAP中的三種特性,所以我們一般使用最終一致性BASE。 ACID: 原子性(At
分散式事務常見解決方案
分散式一致性協議 XA介面 XA是由X/Open組織提出的分散式事務的規範。XA規範主要定義了(全域性)事務管理器(Transaction Manager)和(區域性)資源管理器(Resource Manager)之間的介面。XA介面是雙向的系統介面,在事務管理器(Transaction Ma
8 分散式事務的解決方案
目錄 事務 事務 由一組操作構成的可靠,獨立的工作單元; ACID: 原子性 隔離性 一致性 永續性 java有三種事務,jdbc事務,jta事務,容器事務,jdbc事務無法實現分散式事務的控制,jta是可以實現的,容器事務(s
深入理解高併發下分散式事務的解決方案
1、什麼是分散式事務 分散式事務就是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。以上是百度百科的解釋,簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分佈在不同的伺服器上,且屬於不同的應用,分散式事務需要保證這
Spring Cloud分散式事務終極解決方案探討
一 前言 本話題已收入視訊講座《Spring Cloud分散式事務解決方案》大家不妨圍觀下 阿里2017雲棲大會《破解世界性技術難題!GTS讓分散式事務簡單高效》中,阿里聲稱提出了一種破解世界性難題之分散式事務的終極解決方案,無論是可靠性、還是處理速率都領先於市面上所有的技
深入理解分散式事務,高併發下分散式事務的解決方案
1、什麼是分散式事務 分散式事務就是指事務的參與者、支援事務的伺服器、資源伺服器以及事務管理器分別位於不同的分散式系統的不同節點之上。以上是百度百科的解釋,簡單的說,就是一次大的操作由不同的小操作組成,這些小的操作分佈在不同的伺服器上,且屬於不同的應用,分散式事務需要保證這
資料庫:分散式事務的解決方案
本節涉及到一些技術術語:2PC、CAP、BASE、RocketMQ、RabbitMQ、XA、Kafka、TCC 事務 在資料庫系統中,一個事務是指:由一系列資料庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原賬戶扣除金額,以及向目標賬戶新增金額,這兩個資料庫操作的總和,構成一個完整的邏
搞懂分散式技術18:分散式事務常用解決方案
分散式事務的解決方案分散式事務的解決方案有如下幾種:全域性訊息基於可靠訊息服務的分散式事務TCC最大努力通知方案1:全域性事務(DTP模型)全域性事務基於DTP模型實現。DTP是由X/Open組織提出的一種分散式事務模型——X/Open Distributed Transaction Processing R
24.分庫分表導致的分散式事務及其解決方案
事務在資料庫系統中,一個事務是指:由一系列資料庫操作組成的一個完整的邏輯過程。例如銀行轉帳,從原賬戶扣除金額,以及向目標賬戶新增金額,這兩個資料庫操作的總和,構成一個完整的邏輯過程,不可拆分。這個過程被稱為一個事務,具有ACID特性。ACID:是指在資料庫管理系統(DBMS)
分散式鎖,分散式事務以及解決方案瞭解一下
一、分散式鎖 1、什麼是分散式鎖? 場景1:常規的我們多執行緒訪問同一程式碼塊的時候,為了保證同一時間只能 由一個執行緒訪問,保證資料安全一致性,通常我們使用synchronized關鍵字來對方法加鎖,以達到保證資料安全性。 場景2:現在越來越多的專案,為了追求效能與高
分散式事務,解決方案
聊聊分散式事務,再說說解決方案 分散式事務CAP理解論證-解決方案 分散式系統的2PC、3PC詳細分析 github tcc示例 分散式事務、重複消費、順序消費 一、理論 CAP相關: CAP與BASE相關:我的部落格 而對於分散式中的問題的解決方案,CAP原則出現,描述如下: 一致性(Consistency
漫談分散式事務的那些解決方案
事務我們都不陌生,我們常說的事務一般都是指單機事務,即本地事務。那分散式事務是什麼?分散式事務就是由多個本地事務組合而成的事務,一般在分散式場景下才會出現。 比如電商平臺中,我們在購物的時候,下單支付這個過程看上去是一氣呵成的,但是背後可能是多個系統的分工合作。訂單系統、支付系統、物流系統等。這些系統部署在不
訊息中介軟體(一)分散式系統事務一致性解決方案大對比,誰最好使?(轉)
原文轉載至:https://blog.csdn.net/lovesomnus/article/details/51785108 在分散式系統中,同時滿足“一致性”、“可用性”和“分割槽容錯性”三者是不可能的。分散式系統的事務一致性是一個技術難題,各種解決方案孰優孰劣? 在OLTP系統領域,
訊息中介軟體(一)分散式系統事務一致性解決方案大對比,誰最好使?
在分散式系統中,同時滿足“一致性”、“可用性”和“分割槽容錯性”三者是不可能的。分散式系統的事務一致性是一個技術難題,各種解決方案孰優孰劣? 在OLTP系統領域,我們在很多業務場景下都會面臨事務一致性方面的需求,例如最經典的Bob給Smith轉賬的案例。傳統的企業開發,
分散式系統事務一致性解決方案
開篇 在OLTP系統領域,我們在很多業務場景下都會面臨事務一致性方面的需求,例如最經典的Bob給Smith轉賬的案例。傳統的企業開發,系統往往是以單體應用形式存在的,也沒有橫跨多個數據庫。我們通常只需藉助開發平臺中特有資料訪問技術和框架(例如Spring、JD
分布式系統事務一致性解決方案
基本 插入 關系型 悲劇 win 比較 -1 返回結果 轉賬 開篇 在OLTP系統領域,我們在很多業務場景下都會面臨事務一致性方面的需求,例如最經典的Bob給Smith轉賬的案例。傳統的企業開發,系統往往是以單體應用形式存在的,也沒有橫跨多個數據庫。我們通常只需借助開發平臺
分布式系統事務一致性解決方案(轉)
跨庫 sources body 情況下 jpg 分庫 ability 開源 數據 本文首發於InfoQ,版權所有,請勿轉載!!!http://www.infoq.com/cn/articles/solution-of-distributed-system-transacti
設計----【分布式事務】分布式事務和解決方案
reat 錯誤 級別 err ons 撤銷 丟失 system 狀態 一、前言 分布式事務是企業集成中的一個技術難點,也是每一個分布式系統架構中都會涉及到的一個東西,特別是在微服務架構中,幾乎可以說是無法避免,本文就分布式事務來簡單聊一下。 二、數據庫事務 在說分布式
Amoeba:開源的分散式資料庫Porxy解決方案
來源:https://www.biaodianfu.com/amoeba.html 什麼是Amoeba? Amoeba(變形蟲)專案,該開源框架於2008年 開始釋出一款 Amoeba for Mysql軟體。這個軟體致力於MySQL的分散式資料庫前端代理層,它主要在應用層訪問MySQL的
分散式事務那些事兒之TCC
一、TCC簡介 TCC是一種比較成熟的分散式事務解決方案,可用於解決跨庫操作的資料一致性問題; TCC是服務化的兩階段程式設計模型,其Try、Confirm、Cancel 3個方法均由業務編碼實現; 其中Try操作作為一階段,負責資源的檢查和預留,Confirm操作作為二階段提交操作,執