RocketMQ訊息丟失解決方案 事務訊息

2022-03-09 06:27:44 字數 2355 閱讀 3992

上篇文章,王子通過乙個小案例和小夥伴們一起分析了一下訊息是如何丟失的,但沒有提出具體的解決方案。

我們已經知道發生訊息丟失的原因大體上分為三個部分:

1.生產者傳送訊息到mq這一過程導致訊息丟失

2.mq自己發生故障導致訊息丟失

3.消費者拿到訊息後,由於操作不當導致訊息丟失

接下來我們就針對第一種情況,聊一聊如何解決生產者傳送訊息過程中的訊息丟失問題。

針對於這一問題,rocketmq是自帶一套解決方案的,就是事務訊息。今天我們就來看一下事務訊息的實現流程。

案例還是上次的案例,當使用者通過訂單系統下訂單支付的時候,在訂單支付成功後,會傳送訊息給mq,但是這樣的流程是無法保證事務性的。

當我們引入事務訊息後,其實訂單系統是不會先去執行crud的操作的,而是先傳送一條half訊息給mq,這個half訊息其實就是訂單完成支付的訊息,你可以理解為它的狀態是half狀態。

而積分系統是無法消費half狀態的訊息的。

訂單系統傳送了half訊息後就會等待mq給出成功的響應,如下圖:

看到這裡有些小夥伴可能會問,為什麼要傳送half訊息呢?

其實大家可以想一下,假如我們不傳送half訊息,直接去運算元據庫,把訂單支付業務走完,然後再去傳送訊息給mq,結果傳送過程中發生了異常,這就導致了積分系統無法消費到訊息,就會導致支付成功,而積分沒有發放的情況。

所以我們先發一條half訊息,就是為了先確認一下能否正常傳送訊息,或者說確認mq是不是還活著,並且告訴mq接下來的訊息很重要,不能丟失掉。

half訊息的傳送也是可能失敗的,可能因為報錯、mq自己掛了、或者網路原因導致訊息傳送失敗。

那訂單系統就會得到這一反饋,接著就應該進行回滾操作,比如訂單關閉,退款等操作。

那麼假如half訊息傳送成功,並得到了成功的響應後,訂單系統應該怎麼做呢?

這個時候,訂單系統就應該去運算元據庫,完成自己的業務功能了。

因為half訊息傳送成功,表示mq可以正常接收訊息。

那麼假如half訊息傳送成功,但是沒有得到mq的成功響應,會怎麼辦呢?

這個時候,half訊息已經正常的儲存到了mq中,但訂單系統遲遲不能得到響應,可能會報一些網路超時的錯誤,訂單系統就去執行回滾操作了。

那麼對於這條half訊息該怎麼處理呢?

這就要說到rocketmq的補償機制了,它會去掃瞄half訊息,如果這條half訊息遲遲沒有被rollback或者commit,一定時間後就會**訂單系統的乙個補償介面,判斷一下這步操作是成功了還是失敗了。

如果成功了,那就重新傳送commit訊息給mq,失敗了,重新傳送rollback訊息給mq。後文會介紹rollback和commit訊息。

那麼接下來如果訂單系統在執行資料庫的時候發生了異常怎麼辦呢?

這個時候資料庫本身是有事務機制的,同時我們再傳送一條rollback訊息給mq就可以了。

這個時候mq接收到rollback訊息後,就會把之前的half訊息給作廢掉了。

那麼訂單系統自己的業務成功完成後接著做什麼呢?

這個時候就要傳送一條commit訊息給mq了,讓mq把之前的half訊息執行commit操作,之後積分系統就可以看到這條訊息了。

rollback或者commit訊息也是可能傳送失敗的,這個時候其實也很簡單。

上文中我們已經說到了rocketmq的補償機制,所以無論訂單系統本身是要傳送rollback訊息還是commit訊息,如果傳送失敗,mq的補償機制就會掃瞄這條half訊息,一定時間之後**訂單系統的補償介面,判斷執行是否成功了,然後重新傳送訊息給mq就可以了

今天我們通過對rocketmq傳送訊息這一過程進行各種情況的分析,會發現,開啟事務訊息流程後,生產者傳送訊息到mq這一過程的訊息可靠性是可以得到保證的。

往期文章推薦:

rocketmq的傳送模式和消費模式

討論一下秒殺系統的技術難點與解決方案

秒殺系統中的扣減庫存和流量削峰

深入研究rocketmq生產者傳送訊息的底層原理

深入研究broker是如何持久化的

dledger是如何實現主從自動切換的

深入研究rocketmq消費者是如何獲取訊息的

rocketmq的訊息是怎麼丟失的

RocketMQ保證訊息不丟失

分別從producer傳送機制 broker的持久化機制,以及消費者的offset機制來最大程度保證訊息不易丟失 從producer的視角來看 如果訊息未能正確的儲存在mq中,或者消費者未能正確的消費到這條訊息,都是訊息丟失。從broker的視角來看 如果訊息已經存在broker裡面了,如何保證不會...

rocketmq如何保證訊息不丟失

一 大體可以從三方面來說 分別從producer傳送機制 broker的持久化機制,以及消費者的offset機制來最大程度保證訊息不易丟失 從producer的視角來看 如果訊息未能正確的儲存在mq中,或者消費者未能正確的消費到這條訊息,都是訊息丟失。從broker的視角來看 如果訊息已經存在bro...

RocketMQ如何保證訊息不丟失(訊息可靠性)

為什麼說rocketmq更適用於業務型的訊息中介軟體,因為它能夠保證訊息不丟失且帶有事務訊息。先來看一張rocketmq集群部署結構 其中name server主要是提供路由資訊,這裡暫時忽略,大致流程為 producer 生產者生產訊息 broker 儲存訊息 consumer 消費訊息 接下來我...