用合約簽署來理解 Two-Phase Commit

Limit
Limit
Gentle and strong, Limit shines.
Cover Image for 用合約簽署來理解 Two-Phase Commit

本文所有圖片皆由 DALL-E 生成。

 

合約簽署與 Two-Phase Commit

在分散式系統中,如何確保所有節點在執行 Transaction 時達成一致呢?Two-Phase Commit (2PC) 協議就是為了解決這個問題而設計的。讓我們用合約簽署的過程來解釋這個協議。

想像一個情境:你和幾位朋友決定一起投資一個專案。為了確保每個人都同意投資條件,你們決定簽署一份合約,而這個過程就像是 Two-Phase Commit(2PC) 協議的運作方式。

 

角色介紹:Coordinator 與 Participants

在 Two-Phase Commit 協議中,有兩個主要角色:Coordinator 和 Participants。讓我們看看在合約簽署的譬喻中,這些角色分別對應到哪些角色,以及他們的職責是什麼。

Coordinator

在合約簽署的過程中,Coordinator 就像是這次投資的發起人或組織者。他的職責是起草合約,並將合約草案分發給所有參與者(Participants)。在準備階段,Coordinator 需要收集所有參與者的回覆,確認他們是否同意合約條款。在提交階段,Coordinator 會根據所有參與者的回覆,決定是否正式簽署合約。

職責

  • 分發合約草案給所有參與者。
  • 收集並確認所有參與者的回覆。
  • 決定是否進入提交階段。

 

Participants

Participants 就像是這次投資的每一位朋友。他們的職責是仔細閱讀合約草案,並在準備階段回覆 Coordinator,表示是否同意合約條款。在提交階段,若所有人都同意,他們需要正式簽署合約。

職責

  • 閱讀並確認合約草案。
  • 在準備階段回覆 Coordinator。
  • 在提交階段正式簽署合約(若所有人同意)。

這樣的角色分工確保了在 Two-Phase Commit 協議中,所有節點都能夠協同工作,達成一致性。

 

Two-Phase Commit Process

第一階段:準備階段

在合約簽署的第一階段,稱為「準備階段」,每個人都會收到合約草案。這時候,大家需要仔細閱讀合約內容,確認是否同意所有條款。就像在這個階段,協調者會發送一個「可以簽署嗎?」的請求給所有參與者(發送 canCommit 請求)。每位參與者在收到這個請求後,會準備好所有需要的資料,然後回覆他們的決定(同意或不同意)給協調者。這就像是 2PC 中的「準備」階段,系統中的每個節點都會收到 Transaction 請求,並檢查是否能夠執行。

Prepare.jpg

 

確認合約內容,並決定要不要簽署,這就是準備階段!

第二階段:提交階段

如果所有人都同意合約內容,接下來就是「提交階段」。在這個階段,大家會正式簽署合約,表示同意並願意履行合約中的條款。這就像是 2PC 中的「提交」階段,所有節點都會正式執行 Transaction,確保系統達成一致。

在這個階段,協調者會收集所有朋友的回覆。如果每個人都表示同意(投 Yes),協調者就會通知大家可以正式簽署合約(發送 doCommit 請求)。但如果有任何人不同意,協調者就會決定放棄這次投資,並告知所有已經同意的人取消這次簽署(發送放棄 doAbort 請求)。

那些同意簽署的朋友會等待協調者的最終指示:是繼續簽署還是放棄。當他們收到可以簽署的通知後,他們會正式簽署合約,並告知協調者已經完成簽署(回覆 haveCommitted),以確保每個人的資訊是一致的。

Commit.jpg

 

簽署合約,這就是提交階段!

 

流程圖

完成 Transaction 流程圖

 

放棄 Transaction 流程圖

 

網路分區的處理

如果在 Two-Phase Commit 的過程中發生網路分區,系統可能會進入一種不確定的狀態,因為某些節點可能無法收到其他節點的確認信息。在這種情況下,系統通常會選擇中止 Transaction,以確保資料的一致性。

對應到簽署合約的譬喻,這就像是某位朋友在簽署合約的過程中突然失聯。為了確保所有人都同意合約內容,大家可能會選擇暫停簽署,等待失聯的朋友重新聯繫,或者決定不再進行這次投資而取消合約的簽署。

Absent.jpg

 

解決 CAP 問題

Two-Phase Commit 協議在某種程度上解決了 CAP 定理中的一致性問題。透過兩階段的確認和提交,系統可以確保所有節點在 Transaction 執行時達成一致。然而,這也可能導致系統的可用性受到影響,因為在等待所有節點確認的過程中,系統可能會暫時無法處理其他請求。

在 CAP 定理中,Two-Phase Commit 協議主要解決了「一致性」的問題。它確保了在 Transaction 過程中,所有節點都能達成一致,避免了資料不一致的情況。然而,這樣的設計可能會犧牲「可用性」,因為在等待所有節點確認的過程中,系統可能會暫時無法處理其他請求。

 

結語:在合約中學習分散式系統

Two-Phase Commit 協議讓我們了解到,在分散式系統中,為了達成一致性,我們需要經過多階段的確認和提交。這就像簽署合約一樣,需要每個參與者的同意和承諾。透過這樣的協議,我們可以在一定程度上解決 CAP 定理中的一致性問題,但也必須在可用性上做出取捨。當網路分區發生時,系統需要做出明智的選擇,以確保整體的一致性和穩定性。