如何解決微服務分布式事務問題


CAP 定理

CAP 必須滿足以下的 3 個屬性:

一致性(C):在分布式系統中的所有數據備份,在同一時刻是否同樣的值。(等同於所有節點訪問同一份最新的數據副本)

可用性(A):在集群中一部分節點故障后,集群整體是否還能響應客戶端的讀寫請求。(對數據更新具備高可用性)

分區容錯性(P):以實際效果而言,分區相當於對通信的時限要求。系統如果不能在時限內達成數據一致性,就意味着發生了分區的情況,必須就當前操作在 C 和 A 之間做出選擇。

簡單的來說,在一個分布式系統中,最多能支持上面的兩種屬性。但顯然既然是分布式注定我們是必然要進行分區,既然分區,我們就無法百分百避免分區的錯誤。因此,我們只能在一致性和可用性去作出選擇。

在分布式系統中,我們往往追求的是可用性,它的重要性比一致性要高,那么如何實現高可用,這里又有一個理論,就是 BASE 理論,它給 CAP 理論做了進一步的擴充。

BASE 理論

Basically Available(基本可用)

Soft state(軟狀態)

Eventually consistent(最終一致性)

BASE 理論是對 CAP 中的一致性和可用性進行一個權衡的結果,理論的核心思想就是:我們無法做到強一致,但每個應用都可以根據自身的業務特點,采用適當的方式來使系統達到最終一致性。

MQ消息事務-RocketMQ

先說說MQ的分布式事務,RocketMq在4.3版本已經正式宣布支持分布式事務,在選擇Rokcetmq做分布式事務請務必選擇4.3以上的版本。

事務消息作為一種異步確保型事務, 將兩個事務分支通過 MQ 進行異步解耦,RocketMQ 事務消息的設計流程同樣借鑒了兩階段提交理論,整體交互流程如下圖所示:

這個時候我們基本可以認為,只有MQ發送方自己的本地事務執行完畢,那么MQ的訂閱方必定百分百能夠接收到消息,我們再對下單減庫存的步驟進行改造:

這里涉及到一個異步化的改造,我們理一下如果是同步流程中的各個步驟

查看商品詳情(或購物車)

計算商品價格和目前商品存在庫存(生成訂單詳情)

商品扣庫存(調用商品庫存服務)

訂單確認(生成有效訂單)

訂單創建完成后,發布一個事件“orderCreate” 到消息隊列中,然后由MQ轉發給訂閱該消息的服務,因為是基於消息事務,我們可以認為訂閱該消息的商品模塊是百分百能收到這個消息的。


商品服務接受到orderCreate消息后就執行扣減庫存的操作,注意,這里可能會有一些不可抗的因素導致扣減庫存失敗,無論成功或失敗,商品服務都將發送一個扣減庫存結果的消息“stroeReduce”到消息隊列中,訂單服務會訂閱扣減庫存的結果。

訂單服務收到消息后有兩種可能:

如果扣減庫存成功,將訂單狀態改為 “確認訂單” ,下單成功

如果扣減庫存失敗,將訂單狀態改為 “失效訂單” ,下單失敗


這種模式將確認訂單的流程變成異步化,非常適合在高並發的使用,但是,切記了,這個需要前端用戶體驗的一些改變,要配合產品來涉及流程。

完美,使用MQ分布式事務就可以解決調一致性問題
MQ消息事務方案的風險了解一下

上面使用MQ的方式確實是可以完成A和B操作,但是A和B並不是嚴格一致性,而是最終一致性,我們犧牲掉嚴格一致性,換來性能的提升,這種很適合在大促高並發場景總使用,但是如果B一直執行不成功,那么一致性也會被破壞,后續應該考慮到更多的兜底方案,方案越細系統就將越復雜。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM