啥是2PC?在架構設計中有什么用?
什么是2PC?
二階段提交2PC(Two phase Commit)是指,在分布式系統里,為了保證所有節點在進行事務提交時保持一致性的一種協議算法。
為什么要引入2PC?
在分布式系統里,每個節點都可以知曉自己操作的成功或者失敗,卻無法知道其他節點操作的成功或失敗。
因此,當一個事務跨越多個節點時,為了保持事務的原子性與一致性,可行引入一個協調者(Coordinator)來統一掌控所有參與者(Participant)的操作結果,并指示它們是否要把操作結果進行真正的提交(commit)或者回滾(rollback)。
而2PC,就是這個思路的一個落地實踐。
兩階段提交,是怎么個兩階段法?
2PC的實施思路可概括為:投票階段(voting phase)與提交階段(commit phase):
- 投票階段,參與者將操作結果通知協調者;
- 提交階段:收到參與者的通知后,協調者再向參與者發出通知,根據反饋情況決定各參與者是否要提交還是回滾。
2PC有什么不足?
答:在算法執行過程中,所有節點都處于阻塞狀態,所有節點所持有的資源(例如數據庫數據,本地文件等)都處于封鎖狀態。
典型場景為:
- 某一個參與者確認之前,所有參與者以及協調者都處于阻塞狀態;
- 在協調者確認之前,所有參與者都處于阻塞狀態;
另外,如有協調者或者某個參與者出現了崩潰,為了避免整個算法處于一個完全阻塞狀態,往往需要借助超時機制來將算法繼續向前推進,總的來說,2PC是一種比較保守的算法。
舉個例子:
甲乙丙丁四人要組織一個會議,需要確定會議時間,不妨設甲是協調者,乙丙丁是參與者。
投票階段:
- 甲發郵件給乙丙丁,周二十點開會是否有時間;
- 甲回復有時間;
- 乙回復有時間;
- 丙遲遲不回復,此時對于這個活動,甲乙丙均處于阻塞狀態,算法無法繼續進行;
- 丙回復有時間(或者沒有時間);
提交階段:
- 協調者甲將收集到的結果反饋給乙丙丁(什么時候反饋,以及反饋結果如何,在此例中取決于丙的時間與決定);
- 乙收到;
- 丙收到;
- 丁收到;
可以看到,當出現極端情況時,如果不借助超時,整個活動的推進非常的低效。
這么多缺點,那為什么2PC的應用還這么廣泛呢?
- 其一,2PC原理簡單,易于實現;
- 其二,協調者有明確的控制權,而不像paxos算法各節點平等,自選舉,自推進,不可控。明確可控在工程系統中相當重要;
- 其三,能切實地解決微服務架構中,很多本地邏輯與遠程數據庫,緩存,MQ分布式事務的實際問題;
- 其四,它是一個非常通用的方案。
因此,它的使用非常廣泛。
知其然,知其所以然。
思路比結論更重要。