在之前的文章中我曾介紹了2pc協議的相關知識,這篇文章開始介紹3pc協議。理論知識往往是枯燥無味的,但是等學完了技術再回過頭來重新認識的時候,你會有不一樣的收穫。這個點是面試常問的點,而且如果你正在對java技術或者是其他的技術進階學習的話,這個知識點也是應該要掌握的。
一、前言回顧
CAP理論指的是一個分佈式系統最多隻能同時滿足一致性(Consistency)、可用性(Availability)和分區容錯性(Partition tolerance)這三項中的兩項。比如下面這張圖:
其實很重要的一個分佈式理論知識點-3pc協議介紹(大廠面試常問)
在這三項當中AP在實際應用中較多,它捨棄了一致性。爲什麼要捨棄一致性呢?就好比是我們在買火車票的時候,明明看到還有一張票,可是等我選好了座位準備付錢的時候,系統卻提示沒票了。這就是捨棄了一致性,數據可能是不一致的。但是分區容錯性和可用性卻得到了滿足。
但這不是說一致性不重要,相反恰恰它是最重要的。我們再舉個例子,在我們的銀行系統中就必須要求數據的一致性,道理你也能明白,對我們來說,我們捨棄的只是強一致性。但是一定要滿足最終一致性。也就是說,但是最終也要將數據同步成功來保證數據一致。
BASE 是 Basically Available(基本可用)、Soft state(軟狀態)和 Eventually consistent (最終一致性)三個短語的縮 寫。BASE理論是對CAP中AP的一個擴展。從上圖我們已經能夠看出了。
爲了實現 BASE 理論,需要在可用性和一致性之間找到一個合適的一致性理論,之前曾經使用過2pc協議,但是這種協議過於保守,會出現很多的問題,因此爲了解決2pc協議的缺陷,出現了3pc協議。
二、什麼是3pc協議
我們首先來看一下2pc協議是如何保證最終一致性的。
其實很重要的一個分佈式理論知識點-3pc協議介紹(大廠面試常問)
也就是說2pc協議主要分爲兩個階段:
(1)提交事務請求
(2)執行事務提交
現在我們使用3pc協議來更改一下看看:
其實很重要的一個分佈式理論知識點-3pc協議介紹(大廠面試常問)
也就是說,3PC 將階段一 “提交事務請求” 分成了2部分,總共形成了 3 個部分:
(1)CanCommit
(2)PreCommit
(3)do Commit
階段一:CanCommit
(1)事務詢問:協調者向參與者發送一個包含事務內容的 canCommit 請求,詢問是否可以執行事務提交操作,並等待響應。
(2)各參與者向協調者反饋事務詢問的響應,如果參與者認爲自己可以順利執行事務,就返回 Yes,否則反饋 No 響應。
階段 二:PreCommit
協調者在得到所有參與者的響應之後,會根據結果執行2種操作:執行事務預提交,或者中斷事務。
(1)執行事務預提交:
首先協調者向所有參與者節點發出 preCommit 的請求,並等待響應。然後參與者受到 preCommit 請求後,會執行事務操作,並將結果返回。最後協調者得到了Ack響應,確定下一階段是否爲提交或者是終止操作。
(2)中斷事務也分爲2個步驟:
首先協調者向所有參與者節點發出 abort 請求 。然後參與者如果收到 abort 請求或者超時了,都會中斷事務。
階段三:do Commit
(1)執行提交
首先協調者發送提交請求,並等待Ack 響應。然後參與者收到 doCommit 請求後,執行事務並反饋事務提交結果,向協調者發送 Ack 消息。最後協調者接收 Ack 消息後,完成事務。
(2)中斷事務
中斷事務是因爲出現了異常,比如協調者一方出現了問題,或者是協調者與參與者之間出現了故障。
首先協調者向所有的參與者發送中斷請求。然後參與者接收到中斷請求後,會利用其在二階段記錄的 undo 信息來執行事務回滾操作,並釋放資源。接下來參與者在完成事務回滾之後,向協調者發送 Ack 消息。最後協調者接收到所有的 Ack 消息後,中斷事務。
三、3pc協議的優點
3PC對於協調者和參與者都設置了超時時間,而2PC只有協調者才擁有超時機制。這個優化點,避免了參與者在長時間無法與協調者節點通訊(協調者掛掉了)的情況下,無法釋放資源的問題。
而且3pc多設置了一個緩衝階段保證了在最後提交階段之前各參與節點的狀態是一致的。
喜歡的可以關注我的公衆號:java的架構師技術棧,獲取更多文章和教程資源