<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          分布式事務(wù)|可靠消息最終一致性方案

          共 2111字,需瀏覽 5分鐘

           ·

          2022-07-11 12:45

          事務(wù)想必大家并不陌生,比如經(jīng)常被人提起的ACID,但是為了后續(xù)的分布式事務(wù)的內(nèi)容,我們先來(lái)聊聊 ACID,然后再介紹下什么是分布式事務(wù),最后著重講下基于可靠消息的分布式事務(wù)解決方案。

          什么是事務(wù)

          嚴(yán)格意義上的事務(wù)應(yīng)該是具備原子性、一致性、隔離性和持久性,簡(jiǎn)稱 ACID

          1. 原子性(Atomicity),可以理解為一個(gè)事務(wù)內(nèi)的所有操作要么都執(zhí)行,要么都不執(zhí)行。
          2. 一致性(Consistency),可以理解為數(shù)據(jù)是滿足完整性約束的,也就是不會(huì)存在中間狀態(tài)的數(shù)據(jù),比如你錢包有100,我錢包有100,你給我打50塊,此時(shí)你錢包的錢應(yīng)該是50,我錢包的錢應(yīng)該是150,不會(huì)存在我錢加了,你錢沒扣的中間狀態(tài)。
          3. 隔離性(Isolation),指的是多個(gè)事務(wù)并發(fā)執(zhí)行的時(shí)候不會(huì)互相干擾,即一個(gè)事務(wù)內(nèi)部的數(shù)據(jù)對(duì)于其他事務(wù)來(lái)說(shuō)是隔離的。
          4. 持久性(Durability),指的是一個(gè)事務(wù)完成了之后數(shù)據(jù)就被永遠(yuǎn)保存下來(lái),之后的其他操作或故障都不會(huì)對(duì)事務(wù)的結(jié)果產(chǎn)生影響。

          而通俗意義上事務(wù)就是為了使得一些更新操作要么都成功,要么都失敗

          什么是分布式事務(wù)

          分布式事務(wù)顧名思義就是要在分布式系統(tǒng)中實(shí)現(xiàn)事務(wù),它其實(shí)是由多個(gè)本地事務(wù)組合而成。

          一次大的操作由不同的小操作組成的,這些小的操作分布在不同的服務(wù)器上,分布式事務(wù)需要保證這些小操作要么全部成功,要么全部失敗。從本質(zhì)上來(lái)說(shuō),分布式事務(wù)就是為了保證不同數(shù)據(jù)庫(kù)數(shù)據(jù)一致性

          常見的分布式事務(wù)的解決方案有以下幾種:2PC,3PC,TCC,本地消息表、可靠消息最終一致性、盡最大努力通知

          今天我們就著重講講可靠消息最終一致性的解決方案

          什么是可靠消息最終一致性方案

          可靠消息最終一致性方案是指當(dāng)事務(wù)發(fā)起方執(zhí)行完成本地事務(wù)后發(fā)出消息到消息中間件事務(wù)參與方(消息消費(fèi)者)一定能夠接收到消息并處理事務(wù)成功,此方案強(qiáng)調(diào)的是只要消息發(fā)給事務(wù)參與方,則最終事務(wù)要達(dá)到一致

          這個(gè)方式存在哪些問題?

          此方案是通過(guò)消息中間件實(shí)現(xiàn)的,事務(wù)發(fā)起方(消息生產(chǎn)方)將消息發(fā)給消息中間件,事務(wù)參與方從消息中間件接收消息,由于網(wǎng)絡(luò)通信的不確定性會(huì)導(dǎo)致分布式事務(wù)問題,如下圖:

          1. 本地事務(wù)與消息的原子性問題

          如上圖在虛線框內(nèi),存在以下幾種情況:

          1)本地事務(wù)提交失敗,則消息不發(fā)送。
          2)本地事務(wù)成功,消息發(fā)送失敗,本地事務(wù)回滾。
          3)本地消息成功,消息超時(shí),本地事務(wù)回滾,消息最終失敗。
          4)本地消息成功,消息超時(shí),本地事務(wù)回滾,消息最終成功。

          綜上所述,存在第四種情況,造成本地事務(wù),與消息參與方的事務(wù)不一致。

          1. 事務(wù)參與方接收消息的可靠性。

          消息中間件與事務(wù)參與方要確保能夠成功消費(fèi)到消息。

          1. 消息重復(fù)消費(fèi)

          注意事務(wù)參與方的接口冪等性問題,消息參與方可能已經(jīng)成功消費(fèi),由于網(wǎng)絡(luò)問題導(dǎo)致消息中間件認(rèn)為消息未消費(fèi),發(fā)起重試之后產(chǎn)生的問題。

          解決方案

          1. 本地消息表

          本地消息表的關(guān)鍵在于本地有一張存儲(chǔ)消息日志的記錄表,需要啟動(dòng)一個(gè)定時(shí)任務(wù)去不停地掃描消息日志記錄,確保消息能夠被發(fā)送。具體流程如下圖:

          上圖流程:

          1)事務(wù)發(fā)起方本地事務(wù)執(zhí)行成功,在本地消息表中記錄消息日志。
          2)啟動(dòng)定時(shí)任務(wù),循環(huán)掃描本地消息表。
          3)定時(shí)任務(wù)掃描到消息則發(fā)送消息到消息中間件。
          4)消息中間件收到消息,成功返回消息發(fā)送成功通知給事務(wù)發(fā)起方。
          5)事務(wù)發(fā)起方收到消息發(fā)送成功則刪除日志消息。
          6)事務(wù)參與方訂閱消息,消費(fèi)消息。
          7)事務(wù)參與方處理本地事務(wù)。
          8)本地事務(wù)處理成功,發(fā)送成功ack給消息中間件。

          需要注意的點(diǎn):
          事務(wù)參與方保證接口冪等性

          1. RocketMq事務(wù)消息方案

          Apache RocketMQ 4.3之后的版本正式支持事務(wù)消息,為分布式事務(wù)實(shí)現(xiàn)提供了便利性支持。在RocketMQ 4.3后實(shí)現(xiàn)了完整的事務(wù)消息,實(shí)際上其實(shí)是對(duì)本地消息表的一個(gè)封裝,將本地消息表移動(dòng)到了MQ內(nèi)部,解決 Producer 端的消息發(fā)送與本地事務(wù)執(zhí)行的原子性問題。

          實(shí)現(xiàn)流程:

          1)事務(wù)發(fā)起方發(fā)送Half事務(wù)消息
          2)RocketMq回復(fù)Half發(fā)送成功
          3)事務(wù)發(fā)起方執(zhí)行本地事務(wù)
          4)事務(wù)發(fā)起方執(zhí)行本地事務(wù)成功,發(fā)送commit到RocketMq,mq投遞消息到事務(wù)參與方;事務(wù)發(fā)起方執(zhí)行本地事務(wù)失敗,發(fā)送rollback到RocketMq,mq刪除消息。
          5)當(dāng)RocketMq一定時(shí)間內(nèi)未收到來(lái)自事務(wù)發(fā)起方的確認(rèn)信息,會(huì)對(duì)事務(wù)發(fā)起方進(jìn)行事務(wù)回查
          6)事務(wù)發(fā)起方查詢本地事務(wù)狀態(tài)。
          7)事務(wù)發(fā)起方根據(jù)查詢到的事務(wù)狀態(tài)發(fā)送commint/rollback到RocketMq。
          8)當(dāng)RocketMq發(fā)起commit后,收到失敗或一定時(shí)間未收到成功ack,則會(huì)發(fā)起重試。

          優(yōu)點(diǎn)

          消息數(shù)據(jù)獨(dú)立存儲(chǔ),降低業(yè)務(wù)系統(tǒng)與消息系統(tǒng)之間的耦合。
          吞吐量?jī)?yōu)于本地消息表方案。

          缺點(diǎn)

          一次消息發(fā)送需要兩次網(wǎng)絡(luò)請(qǐng)求(half消息 + commit/rollback)。
          需要實(shí)現(xiàn)消息回查接口。

          其實(shí)每種分布式事務(wù)的解決方案都有優(yōu)劣,我們需要權(quán)衡利弊,選擇最合適業(yè)務(wù)場(chǎng)景的一種才是王道!


          好了。今天就說(shuō)到這了,我還會(huì)不斷分享自己的所學(xué)所想,希望我們一起走在成功的道路上!

           覺得有點(diǎn)東西就點(diǎn)一下“贊和在看”吧!感謝大家的支持了!
          瀏覽 25
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  欧美系列在线观看 | 久草视频在线免费播放 | 挨操成人免费视频 | 狼友视频在线观看 | 人人人人人色 |