天天看點

一分鐘了解兩階段送出協定/算法(分布式理論基礎)

一分鐘了解兩階段送出協定/算法(分布式理論基礎)

兩階段送出協定/算法(2PC)

概念

二階段送出2PC(Two phase Commit)是指,在分布式系統裡,為了保證所有節點在進行事務送出時保持一緻性的一種協定算法。

背景

在分布式系統裡,每個節點都可以知曉自己操作的成功或者失敗,卻無法知道其他節點操作的成功或失敗。

當一個事務跨越多個節點時,為了保持事務的原子性與一緻性,需要引入一個協調者(Coordinator)來統一掌控所有參與者(Participant)的操作結果,并訓示它們是否要把操作結果進行真正的送出(commit)或者復原(rollback)。

思路

2PC顧名思義分為兩個階段,其實施思路可概括為:

(1)投票階段(voting phase):參與者将操作結果通知協調者;

(2)送出階段(commit phase):收到參與者的通知後,協調者再向參與者發出通知,根據回報情況決定各參與者是否要送出還是復原;

缺陷

算法執行過程中,所有節點都處于阻塞狀态,所有節點所持有的資源(例如資料庫資料,本地檔案等)都處于封鎖狀态。

典型場景為:

(1)某一個參與者發出通知之前,所有參與者以及協調者都處于阻塞狀态;

(2)在協調者發出通知之前,所有參與者都處于阻塞狀态;

另外,如有協調者或者某個參與者出現了崩潰,為了避免整個算法處于一個完全阻塞狀态,往往需要借助逾時機制來将算法繼續向前推進,故此時算法的效率比較低。

總的來說,2PC是一種比較保守的算法。

舉例

甲乙丙丁四人要組織一個會議,需要确定會議時間,不妨設甲是協調者,乙丙丁是參與者。

投票階段:

(1)甲發郵件給乙丙丁,周二十點開會是否有時間;

(2)甲回複有時間;

(3)乙回複有時間;

(4)丙遲遲不回複,此時對于這個活動,甲乙丙均處于阻塞狀态,算法無法繼續進行;

(5)丙回複有時間(或者沒有時間);

送出階段:

(1)協調者甲将收集到的結果回報給乙丙丁(什麼時候回報,以及回報結果如何,在此例中取決與丙的時間與決定);

(2)乙收到;

(3)丙收到;

(4)丁收到;

結論

2PC效率很低,分布式事務很難做。

繼續閱讀