遊戲陪玩app原始碼的可靠訊息最終一致性方案的實現

yangxianhuang發表於2021-10-29

一、什麼是可靠訊息最終一致性方案?

遊戲陪玩app原始碼的可靠訊息最終一致性方案是指當事務發起方執行完成本地事務後發出一條訊息到訊息中介軟體,事務參與方(訊息消費者)一定能夠接收到訊息並處理事務成功,此方案強調的是隻要訊息發給遊戲陪玩app原始碼的事務參與方,則最終事務要達到一致。

二、存在哪些問題?

此方案是通過訊息中介軟體實現的,遊戲陪玩app原始碼的事務發起方(訊息生產方)將訊息發給訊息中介軟體,事務參與方從訊息中介軟體接收訊息,由於網路通訊的不確定性會導致分散式事務問題,如下圖:
在這裡插入圖片描述

2.1 本地事務與訊息的原子性問題
在這裡插入圖片描述
如上圖在虛線框內,存在以下幾種情況:
1)遊戲陪玩app原始碼本地事務提交失敗,則訊息不傳送。
2)本地事務成功,訊息傳送失敗,本地事務回滾。
3)本地訊息成功,訊息超時,本地事務回滾,訊息最終失敗。
4)本地訊息成功,訊息超時,本地事務回滾,訊息最終成功。
綜上所述,存在第四種情況,造成本地事務與訊息參與方的事務不一致。

2.2 事務參與方接收訊息的可靠性。

訊息中介軟體與事務參與方要確保能夠成功消費到訊息。

2.3 訊息重複消費

注意遊戲陪玩app原始碼的事務參與者的介面冪等性問題,訊息參與方可能已經成功消費,由於網路問題導致訊息中介軟體認為訊息未消費,發起重試。

三、解決方案

針對第二節中存在的問題,提供兩種解決方案本地訊息表和RocketMq事務訊息。

3.1 本地訊息表

本地訊息表的關鍵在於遊戲陪玩app原始碼本地有一張儲存訊息日誌的記錄表,需要啟動一個定時任務去不停地掃描訊息日誌記錄,確保訊息能夠被髮送。具體流程如下圖:
在這裡插入圖片描述

上圖流程:
1)事務發起方本地事務執行成功,在遊戲陪玩app原始碼本地訊息表中記錄訊息日誌。
2)啟動定時任務,迴圈掃描本地訊息表。
3)定時任務掃描到訊息則傳送訊息到訊息中介軟體。
4)訊息中介軟體收到訊息,成功返回訊息傳送成功通知給事務發起方。
5)事務發起方收到訊息傳送成功則刪除日誌訊息。
6)事務參與方訂閱訊息,消費訊息。
7)事務參與方處理本地事務。
8)本地事務處理成功,傳送成功ack給訊息中介軟體。

需要注意的點:
事務參與方保證介面冪等性。

3.2 RocketMq事務訊息方案

Apache RocketMQ 4.3之後的版本正式支援事務訊息,為遊戲陪玩app原始碼的分散式事務實現提供了便利性支援。在RocketMQ 4.3後實現了完整的事務訊息,實際上其實是對本地訊息表的一個封裝,將本地訊息表移動到了MQ內部,解決 Producer 端的訊息傳送與本地事務執行的原子性問題。
在這裡插入圖片描述

實現流程:
1)事務發起方傳送Half事務訊息
2)RocketMq回覆Half傳送成功
3)事務發起方執行本地事務
4)事務發起方執行遊戲陪玩app原始碼本地事務成功,傳送commit到RocketMq,mq投遞訊息到事務參與方;
事務發起方執行本地事務失敗,傳送rollback到RocketMq,mq刪除訊息。
5)當RocketMq一定時間內未收到來自事務發起方的確認資訊,會對事務發起方進行事務回查。
6)事務發起方查詢遊戲陪玩app原始碼本地事務狀態。
7)事務發起方根據查詢到的事務狀態傳送commint/rollback到RocketMq,繼續走8或9。
8)當RocketMq發起commit後,收到失敗或一定時間未收到成功ack,則會發起重試。

本文轉載自網路,轉載僅為分享乾貨知識,如有侵權歡迎聯絡雲豹科技進行刪除處理
原文連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69971984/viewspace-2839816/,如需轉載,請註明出處,否則將追究法律責任。

相關文章