分布式事務(wù) 3 種方案比較

前言

最近業(yè)務(wù)變動(dòng)準(zhǔn)備面試,看了一下別人的面試情況,都問了關(guān)于分布式事務(wù)的問題。所以今天整理一下。

分布式事務(wù)解決方案

1. XA 方案(兩階段提交方案)
  • 支持的場(chǎng)景:一個(gè)服務(wù)操作多個(gè)數(shù)據(jù)庫(kù),要求事務(wù)跨數(shù)據(jù)庫(kù)保持一致性
  • 實(shí)現(xiàn)原理:事務(wù)管理器(服務(wù)器)對(duì)多個(gè)資源管理器(數(shù)據(jù)庫(kù))發(fā)起事務(wù),多個(gè)資源管理器完成事務(wù)任務(wù)后先不進(jìn)行 commit 操作,事務(wù)管理器檢查所有資源管理器上的事務(wù)是否都能夠完成并都處于待提交狀態(tài)。如果有至少一個(gè)文件管理器無法完成被分配的事務(wù)任務(wù),則事務(wù)管理器通知全部文件管理器進(jìn)行回滾。如果全部文件管理器都進(jìn)入了待提交狀態(tài),則事務(wù)管理器發(fā)起提交請(qǐng)求,讓資源管理器提交各自的事務(wù)。
  • 優(yōu)點(diǎn):通過事務(wù)管理器本身支持的事務(wù)性操作來實(shí)現(xiàn)回滾操作,業(yè)務(wù)側(cè)實(shí)現(xiàn)比較簡(jiǎn)單。
  • 缺點(diǎn):一個(gè)服務(wù)操作多個(gè)數(shù)據(jù)庫(kù)的場(chǎng)景,現(xiàn)在幾乎不存在?,F(xiàn)在的服務(wù)基本都是微服務(wù)的形式,每個(gè)服務(wù)只有自己的一個(gè)數(shù)據(jù)庫(kù)或者沒有數(shù)據(jù)庫(kù)。如果一個(gè)服務(wù)操作多個(gè)數(shù)據(jù)庫(kù),那么除了操作自己的數(shù)據(jù)庫(kù)還要操作別人的數(shù)據(jù)庫(kù),那就亂套了。別人的數(shù)據(jù)庫(kù)是不可能讓你操作的。
2. TCC 方案(Try - Confirm / Cancel)
  • 支持的場(chǎng)景:TCC 方案可以支持強(qiáng)一致性的分布式事務(wù),適合于銀行轉(zhuǎn)賬等要求強(qiáng)一致性的場(chǎng)景
  • 實(shí)現(xiàn)原理:事務(wù)分為三個(gè)階段,即 T - C - C。首先是 Try 階段通知所有參與的服務(wù)器檢查資源并且鎖定資源,如果全部服務(wù)器都可以正常執(zhí)行 try,則執(zhí)行 confirm 操作,即讓參與的服務(wù)器執(zhí)行各自的操作,如果有一個(gè)服務(wù)器無法滿足 try 執(zhí)行的條件,則向其他服務(wù)器發(fā)送 cancel 命令,撤回對(duì)資源的鎖定。
  • 示例:銀行賬戶 A 轉(zhuǎn)賬 100 元到賬戶 B,且這兩個(gè)賬戶分別隸屬于服務(wù)器①和服務(wù)器②,事務(wù)發(fā)起的服務(wù)器記作服務(wù)器③。try 階段:服務(wù)器③向服務(wù)器①②發(fā)送 try 指令,服務(wù)器①鎖定 A 賬戶并檢查 A 賬戶余額是否大于等于 100,服務(wù)器②鎖定 B 賬戶。confirm 階段:如果 try 階段無異常,則服務(wù)器③向服務(wù)器①②發(fā)送 confirm 指令,服務(wù)器①將 A 賬戶余額減去 100 并保存,服務(wù)器②向 B 賬戶增加 100。 如果 try階段不能正確執(zhí)行,比如 A 賬戶余額只有 90 了,則執(zhí)行 cancel 命令,釋放鎖定的 AB 賬戶。
  • 優(yōu)點(diǎn):強(qiáng)一致性,確保完全的事務(wù)完整性
  • 缺點(diǎn):所有事務(wù)操作代碼,例如回滾,都需要業(yè)務(wù)側(cè)自行編寫,極大增加了開發(fā)難度。另外,由于網(wǎng)絡(luò)問題,try-confirm-cancel 信號(hào)可能受到影響,會(huì)出現(xiàn)諸多問題,例如,沒有收到 try 就收到了 cancel 那么服務(wù)器必須支持空回滾,或者收到了兩次 confirm,則要求服務(wù)器支持冪等操作。
3. 可靠消息最終一致性方案
  • 支持場(chǎng)景:沒有強(qiáng)一致性要求,只要求最終一致性的場(chǎng)景,例如賬單支付和商品發(fā)貨,賬單支付后,無需同時(shí)進(jìn)行商品發(fā)貨只要最終商品可以發(fā)貨就行
  • 實(shí)現(xiàn)原理: 例如服務(wù)器A 支持賬單支付,服務(wù)器 B 支持商品發(fā)貨,服務(wù)器 A 在執(zhí)行賬單支付之前發(fā)送一條 prepare 到消息隊(duì)列,如果發(fā)送失敗,則服務(wù)器 A 立即取消后續(xù)操作,如果發(fā)送成功,則服務(wù)器 A 繼續(xù)支付操作,支付成功則發(fā)送成功消息給消息隊(duì)列,支付失敗則發(fā)送失敗消息給消息隊(duì)列。如果是成功的消息,則服務(wù)器 B 馬上執(zhí)行發(fā)貨操作,如果失敗則一直重試,直到成功或者超時(shí)。如果 B 超時(shí)未完成,則想辦法通知 A 回滾,或者發(fā)送報(bào)警消息進(jìn)行人工回滾。
  • 優(yōu)點(diǎn):簡(jiǎn)單高效易于實(shí)現(xiàn),能夠?qū)崿F(xiàn)最終一致性
  • 缺點(diǎn):無法實(shí)現(xiàn)強(qiáng)一致性
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容