
兩階段送出協定/算法(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效率很低,分布式事務很難做。