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

2PC

image.png

2階段提交第一階段詢問(wèn)個(gè)服務(wù)參與者是否能提交事務(wù),參與者記錄事務(wù)日志,需要等待所有服務(wù)反饋yes才執(zhí)行事務(wù),有服務(wù)返回no/超市未響應(yīng)則中斷,對(duì)性能上損耗明顯。之后執(zhí)行事務(wù)。2階段事務(wù)解決方案存在單點(diǎn)故障的問(wèn)題,當(dāng)協(xié)調(diào)者宕機(jī),參與者會(huì)處于阻塞響應(yīng)階段,一直不釋放資,即使協(xié)調(diào)者通過(guò)選舉機(jī)制恢復(fù)使用,也無(wú)法解決阻塞的問(wèn)題。同時(shí)存在事務(wù)環(huán)節(jié)中數(shù)據(jù)不一致的問(wèn)題。

3PC

image.png

3階段提交,canCommit階段發(fā)送指令,等待所有服務(wù)反饋,與2階段提交相似。服務(wù)都返回yes則進(jìn)入preCommit階段,等待服務(wù)反饋可執(zhí)行ack,并記錄事務(wù)日志。如果服務(wù)都返回可執(zhí)行,則提交事務(wù)請(qǐng)求,否則取消事務(wù)。在doCommit階段則返回服務(wù)執(zhí)行結(jié)果決定是否rollback事務(wù)。3階段提交引入超時(shí)機(jī)制,對(duì)于參與者節(jié)點(diǎn)反饋超時(shí)的情況執(zhí)行事務(wù)中斷,但仍然存在數(shù)據(jù)不一致問(wèn)題。

TCC

image.png

TCC三個(gè)操作分別如下:
Try:預(yù)留業(yè)務(wù)資源
Confirm:確認(rèn)執(zhí)行業(yè)務(wù)操作
Cancel:取消執(zhí)行業(yè)務(wù)操作
應(yīng)用向TM提出事務(wù)請(qǐng)求,TM向各服務(wù)節(jié)點(diǎn)發(fā)起try請(qǐng)求。服務(wù)節(jié)點(diǎn)返回失敗,則執(zhí)行參與者的cancel方法。如果參與者都返回ok,則調(diào)用commit參與者的方法,這是參與者的commit都返回ok則事務(wù)完成,否則重試或作事務(wù)補(bǔ)償。

使用MQ可靠消息

image.png

通過(guò)MQ的可靠消息實(shí)現(xiàn)數(shù)據(jù)的最終一致性。在服務(wù)1調(diào)用服務(wù)2的場(chǎng)景下,通過(guò)MQ做中間過(guò)渡作用。服務(wù)1業(yè)務(wù)下事務(wù)完成,則發(fā)送消息到MQ,并記錄發(fā)送的消息記錄,MQ返回ack再更新消息狀態(tài)為發(fā)送成功。消費(fèi)端消費(fèi)MQ消息,實(shí)現(xiàn)自身服務(wù)的業(yè)務(wù),記錄接受的消息記錄。事務(wù)處理成功則返回ack到MQ,不成功記錄消息消費(fèi)記錄,并通知MQ重發(fā)。其中需要設(shè)計(jì)消息的容錯(cuò)策略,例如:生產(chǎn)者發(fā)送消息失敗,可以通過(guò)定時(shí)任務(wù)判斷消息的狀態(tài)及產(chǎn)生時(shí)間進(jìn)行重試處理。消費(fèi)者則需要做接口的冪等,防止消息重復(fù)消費(fèi)。
另外對(duì)于消息消費(fèi)失敗重試次數(shù)達(dá)到一定次數(shù)的進(jìn)行告警并分析原因人工處理。通過(guò)MQ的實(shí)現(xiàn)方式通用性強(qiáng),拓展性高,但需要業(yè)務(wù)上能夠容忍異步的延遲。


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