RocketMQ 事务消息
RocketMQ 事務(wù)消息在實(shí)現(xiàn)上充分利用了 RocketMQ 本身機(jī)制,在實(shí)現(xiàn)零依賴的基礎(chǔ)上,同樣實(shí)現(xiàn)了高性能、可擴(kuò)展、全異步等一系列特性。
在具體實(shí)現(xiàn)上,RocketMQ 通過使用 Half Topic 以及 Operation Topic 兩個(gè)內(nèi)部隊(duì)列來存儲(chǔ)事務(wù)消息推進(jìn)狀態(tài),如下圖所示:
其中,Half Topic 對(duì)應(yīng)隊(duì)列中存放著 prepare 消息,Operation Topic 對(duì)應(yīng)的隊(duì)列則存放了 prepare message 對(duì)應(yīng)的 commit/rollback 消息,消息體中則是 prepare message 對(duì)應(yīng)的 offset,服務(wù)端通過比對(duì)兩個(gè)隊(duì)列的差值來找到尚未提交的超時(shí)事務(wù),進(jìn)行回查。
在具體實(shí)現(xiàn)上,事務(wù)消息作為普通消息的一個(gè)應(yīng)用場(chǎng)景,在實(shí)現(xiàn)過程中進(jìn)行了分層抽象,從而避免了對(duì) RocketMQ 原有存儲(chǔ)機(jī)制的修改,如下圖所示:
從用戶側(cè)來說,用戶需要分別實(shí)現(xiàn)本地事務(wù)執(zhí)行以及本地事務(wù)回查方法,因此只需關(guān)注本地事務(wù)的執(zhí)行狀態(tài)即可;而在 service 層,則對(duì)事務(wù)消息的兩階段提交進(jìn)行了抽象,同時(shí)針對(duì)超時(shí)事務(wù)實(shí)現(xiàn)了回查邏輯,通過不斷掃描當(dāng)前事務(wù)推進(jìn)狀態(tài),來不斷反向請(qǐng)求 Producer 端獲取超時(shí)事務(wù)的執(zhí)行狀態(tài),在避免事務(wù)掛起的同時(shí),也避免了 Producer 端的單點(diǎn)故障。而在存儲(chǔ)層,RocketMQ 通過 Bridge 封裝了與底層隊(duì)列存儲(chǔ)的相關(guān)操作,用以操作兩個(gè)對(duì)應(yīng)的內(nèi)部隊(duì)列,用戶也可以依賴其他存儲(chǔ)介質(zhì)實(shí)現(xiàn)自己的 service,RocketMQ 會(huì)通過 ServiceProvider 加載進(jìn)來。
從上述事務(wù)消息設(shè)計(jì)中可以看到,RocketMQ 事務(wù)消息較好的解決了事務(wù)的最終一致性問題,事務(wù)發(fā)起方僅需要關(guān)注本地事務(wù)執(zhí)行以及實(shí)現(xiàn)回查接口給出事務(wù)狀態(tài)判定等實(shí)現(xiàn),而且在上游事務(wù)峰值高時(shí),可以通過消息隊(duì)列,避免對(duì)下游服務(wù)產(chǎn)生過大壓力。
事務(wù)消息不僅適用于上游事務(wù)對(duì)下游事務(wù)無依賴的場(chǎng)景,還可以與一些傳統(tǒng)分布式事務(wù)架構(gòu)相結(jié)合,而 MQ 的服務(wù)端作為天生的具有高可用能力的協(xié)調(diào)者,使得我們未來可以基于 RocketMQ 提供一站式輕量級(jí)分布式事務(wù)解決方案,用以滿足各種場(chǎng)景下的分布式事務(wù)需求。
?
事務(wù)消息作為一種異步確保型事務(wù), ?將兩個(gè)事務(wù)分支通過 MQ 進(jìn)行異步解耦,RocketMQ 事務(wù)消息的設(shè)計(jì)流程同樣借鑒了兩階段提交理論,整體交互流程如下圖所示:
事務(wù)發(fā)起方首先發(fā)送 prepare(即發(fā)送Half消息)?消息到 MQ。
在發(fā)送 prepare 消息成功后(即收到Half消息發(fā)送成功的回執(zhí)消息)?,執(zhí)行本地事務(wù)(業(yè)務(wù)系統(tǒng)自己的本地事物邏輯代碼)。
根據(jù)本地事務(wù)執(zhí)行結(jié)果,返回給MQ發(fā)送方發(fā)送: commit 或者是 rollback。
如果MQ發(fā)送方接收到的消息是: rollback,MQ 將刪除該 prepare 消息不進(jìn)行下發(fā),如果是 commit 消息,MQ 將會(huì)把這個(gè)消息發(fā)送給 consumer 端。
如果執(zhí)行本地事務(wù)過程中,執(zhí)行端掛掉,或者超時(shí),MQ 將會(huì)不停的詢問其同組的其他 producer 來獲取狀態(tài)。
Consumer 端的消費(fèi)成功機(jī)制有 MQ 保證。
轉(zhuǎn)載于:https://www.cnblogs.com/bootdo/p/10516133.html
總結(jié)
以上是生活随笔為你收集整理的RocketMQ 事务消息的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS项目组件化历程
- 下一篇: shell 脚本逻辑判断