四大分布式事務方案詳解
分布式事務在分布式系統(tǒng)經常遇見,也是大廠經??疾斓膬热?,下面我就重點詳解四大主流分布式事務方案@mikechen
分布式事務
分布式事務是指涉及多個參與者,通常是不同的計算機節(jié)點或服務的事務操作,因此需要跨多個節(jié)點執(zhí)行事務操作。
如下圖所示:
圖片
分布式事務需要確保所有相關操作要么全部成功執(zhí)行,要么全部回滾,以維護數據的一致性和可靠性。
分布式事務解決方案
常見的分布式事務解決方案,主要包含有以下四種:
兩階段提交協(xié)議
兩階段提交協(xié)議,Two-Phase Commit,簡稱是2PC,該協(xié)議包括:準備和提交兩個階段。
如下圖所示:
圖片
1.準備階段
協(xié)調者向所有參與者發(fā)送準備請求,參與者執(zhí)行事務準備,并向協(xié)調者發(fā)送準備就緒的通知。
2.提交階段
如果所有參與者都準備就緒,則協(xié)調者向所有參與者發(fā)送提交請求,參與者執(zhí)行事務提交。
如果所有參與者都成功提交了事務,則事務成功完成。
否則,如果任何一個參與者失敗或者無法提交,則所有參與者都會被要求回滾(Rollback)事務,以保持一致性。
2PC的優(yōu)點是簡單易懂,并且在理想情況下能夠保證分布式系統(tǒng)中事務的原子性和一致性。
兩階段有如下幾個缺點:
1.阻塞問題
在2PC的準備階段,協(xié)調者需要等待所有參與者的響應,這可能會導致整個系統(tǒng)的阻塞。
2.單點故障
在2PC中,協(xié)調者是一個單點,它負責協(xié)調所有參與者的操作。
如果協(xié)調者發(fā)生故障,那么整個事務可能會無法完成,即使參與者的大部分已經準備好了,這種單點故障會影響系統(tǒng)的可用性和可靠性。
3.數據不一致性
2PC無法處理所有故障情況,例如:協(xié)調者和參與者之間的網絡分區(qū)或者通信失敗。
在這種情況下,可能會出現數據不一致性,一些參與者已經提交了事務,而另一些參與者卻未收到提交指令,導致系統(tǒng)狀態(tài)混亂。
三階段提交協(xié)議
三階段提交協(xié)議,Three-phase commit, 簡稱是3PC,3PC是2PC的改進版。
如下圖所示:
圖片
3PC的主要思想是引入一個【預提交階段】,以減輕2PC中的阻塞問題,同時保持原子性和一致性。
3PC,主要分為三個階段:
1.預提交階段
協(xié)調者詢問參與者是否可以提交事務,并等待它們的響應,如果所有參與者都同意,則進入下一階段。
2.提交階段
協(xié)調者向所有參與者發(fā)送提交請求,要求它們提交事務,如果任何參與者無法提交,則執(zhí)行回滾。
3.確認階段
協(xié)調者向所有參與者發(fā)送確認消息,告知它們事務已經提交,這一階段用于解決2PC中的阻塞問題。
3PC相較于2PC的優(yōu)點是在第一階段引入了一個“詢問”階段,避免了2PC的直接準備階段可能出現的長時間阻塞問題。
兩階段與三階段對比,如下圖所示:
圖片
補償事務
TCC(Try-Confirm-Cancel)是一種補償性事務處理模式,用于實現分布式系統(tǒng)中的一致性操作。
如下圖所示:
圖片
TCC模式通過三個階段的操作來確保事務的一致性:嘗試(Try)、確認(Confirm)和取消(Cancel)。
1.嘗試階段(Try)
在嘗試階段,系統(tǒng)會嘗試執(zhí)行事務操作的所有必要檢查和準備工作,以確保事務能夠成功執(zhí)行。
這包括檢查資源的可用性、鎖定所需資源等,如果所有的檢查都通過,系統(tǒng)會記錄下所有的嘗試操作,但并不會實際執(zhí)行事務。
2.確認階段(Confirm)
在確認階段,系統(tǒng)會執(zhí)行事務操作,并且確認之前所做的嘗試操作。
如果事務操作成功執(zhí)行,系統(tǒng)將確認并提交事務,在這個階段,系統(tǒng)會持久化事務的結果,確保事務的最終執(zhí)行。
3.取消階段(Cancel)
如果在嘗試階段或者確認階段發(fā)生了錯誤或者異常情況,系統(tǒng)將進入取消階段。
在這個階段,系統(tǒng)會執(zhí)行逆向操作,取消之前嘗試階段所做的操作,這樣可以確保系統(tǒng)的狀態(tài)回滾到事務開始之前的狀態(tài),以維持數據的一致性。
TCC模式允許開發(fā)人員在每個階段都定義自己的業(yè)務邏輯和補償操作,以適應不同的業(yè)務需求。
但是,TCC模式要求開發(fā)人員在每個階段都顯式定義業(yè)務邏輯和補償操作,這增加了系統(tǒng)的復雜性和開發(fā)成本,需要設計和維護每個階段的邏輯,并確保它們之間的一致性。
最終一致性
最終一致性是分布式系統(tǒng)中的一種一致性模型,它允許數據副本在一段時間內的狀態(tài)之間存在不一致,但最終將會達到一致的狀態(tài)。
如下圖所示:
圖片
在最終一致性模型中,節(jié)點之間的數據同步通常是通過消息傳遞來實現的。
當一個節(jié)點的數據發(fā)生變化時,它會通過異步方式將消息發(fā)送給其他節(jié)點,由于消息傳遞是異步的,因此節(jié)點之間的數據同步可能會有一定的延遲。
因此,最終一致性模型允許節(jié)點之間的數據副本,在一段時間內存在不一致,但最終會收斂到一致的狀態(tài)。