關(guān)于利用MQ實(shí)現(xiàn)分布式事務(wù)的想法

假設(shè):消息服務(wù)不丟消息

場(chǎng)景 服務(wù)A 服務(wù)B 服務(wù)C 消息服務(wù)Q

偽代碼

服務(wù)A中
transaction{
A本地事務(wù)
B.callB();
C.callC();
A本地事務(wù)
}

利用消息服務(wù)來(lái)實(shí)現(xiàn)分布式事務(wù)
原理 當(dāng)服務(wù)A執(zhí)行事務(wù)時(shí),所有指定遠(yuǎn)程調(diào)用會(huì)被轉(zhuǎn)換為發(fā)送一條調(diào)用消息到消息服務(wù),當(dāng)B和C接收到消息時(shí),立即執(zhí)行消息指定的方法,并在提交前發(fā)送回復(fù)消息給A(攜帶有返回值)并且等待接收提交或者回滾消息,服務(wù)A執(zhí)行完方法也在提交前等待B和C的回復(fù),當(dāng)B和C的回復(fù)都為sucess時(shí)發(fā)送提交消息給B和C,然后自己提交,否則回滾。B和C接到提交消息后,提交,否則回滾。

異常情況一:在發(fā)送調(diào)用B的消息時(shí)失敗
服務(wù)A事務(wù)直接回滾

異常情況二:在發(fā)送調(diào)用C的消息時(shí)失敗
服務(wù)A事務(wù)直接回滾,并發(fā)送回滾消息到指定隊(duì)列(此兩步操作由Q的事務(wù)消息保證原子性)

異常情況三:服務(wù)A提交和回滾失敗
由于服務(wù)A提交和回滾操作和發(fā)送提交或者回滾消息在一個(gè)事務(wù)內(nèi),所以放在一起討論,
由于此部分由消息中間件保證原子性,固提交或者回滾失敗,不會(huì)有提交或者回滾消息到達(dá)消息中間件,B和C等待一段時(shí)間后自動(dòng)回滾

異常情況四:B在發(fā)送回復(fù)消息時(shí)失敗
A在等待指定時(shí)間后沒有收到B的回復(fù),進(jìn)行回滾操作并發(fā)送回滾消息到指定隊(duì)列,C在收到回滾消息后回滾,B在等待指定時(shí)間后沒有收到A的提交消息回滾

異常情況五:C在發(fā)送回復(fù)消息時(shí)失敗
同異常情況四

異常情況六:B提交失敗或者C提交失敗
B或C中調(diào)用消息和提交消息均不消費(fèi),會(huì)進(jìn)行重試

異常情況七:B或者C回滾失敗
同異常情況六

異常情況八:B或者C邏輯出現(xiàn)異常導(dǎo)致失敗
B或者C直接回滾,并且發(fā)送失敗回復(fù)

停機(jī)啟動(dòng)恢復(fù)處理

由于異常導(dǎo)致的死機(jī),然后重啟后的邏輯

一、只接收到調(diào)用消息,執(zhí)行,然后等待固定時(shí)間后回滾。
二、按照順序接收到調(diào)用消息和提交消息,執(zhí)行然后提交
三、先接收到提交消息后接收到調(diào)用消息,一樣,執(zhí)行然后提交
四、接收到調(diào)用和回滾消息,同上

從上可以推導(dǎo)出,利用消息系統(tǒng)做分布式事務(wù)的兩個(gè)特性
強(qiáng)調(diào)一下假設(shè):消息服務(wù)不丟消息
一、在網(wǎng)絡(luò)暢通所有服務(wù)高可用的情況下,可以做到數(shù)據(jù)的強(qiáng)一致性
二、在網(wǎng)絡(luò)和服務(wù)可能存在故障的情況下,可以做到數(shù)據(jù)的最終一致性

關(guān)于數(shù)據(jù)在最終一致性情況下的查詢問題
1.最好的解決方案是不管,更新后查詢數(shù)據(jù)查到舊的數(shù)據(jù)就讓它查到舊的數(shù)據(jù)
2.可以利用緩存,自己寫邏輯實(shí)現(xiàn),還未提交的數(shù)據(jù)緩存下來(lái),查詢時(shí)先查詢緩存

最后編輯于
?著作權(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)容

  • 轉(zhuǎn)載個(gè)人原創(chuàng)微信版 文章摘要:原來(lái)大型分布式/微服務(wù)系統(tǒng)中解決數(shù)據(jù)一致性問題,居然是通過…… 目前云計(jì)算、大數(shù)據(jù)、...
    癲狂俠閱讀 1,332評(píng)論 0 6
  • 當(dāng)我們?cè)谏a(chǎn)線上用一臺(tái)服務(wù)器來(lái)提供數(shù)據(jù)服務(wù)的時(shí)候,我會(huì)遇到如下的兩個(gè)問題: 1)一臺(tái)服務(wù)器的性能不足以提供足夠的能...
    isgiker閱讀 664評(píng)論 0 5
  • 轉(zhuǎn)載自己該篇文章的微信版本鏈接 文章摘要:原來(lái)大型分布式/微服務(wù)系統(tǒng)中解決數(shù)據(jù)一致性問題,居然是通過…… 一、為什...
    癲狂俠閱讀 2,865評(píng)論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,644評(píng)論 19 139
  • 閱讀時(shí)間:40分鐘 問題:能記住一些,但是感覺比較散,表達(dá)出來(lái)時(shí)不太好 讀了第五、六章,朝著目標(biāo),養(yǎng)成堅(jiān)持的習(xí)慣,...
    葉宸西閱讀 455評(píng)論 1 0

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