RocketMQ 消息丟失場(chǎng)景分析及如何解決!


生產(chǎn)者產(chǎn)生消息發(fā)送給RocketMQ RocketMQ接收到了消息之后,必然需要存到磁盤(pán)中,否則斷電或宕機(jī)之后會(huì)造成數(shù)據(jù)的丟失 消費(fèi)者從RocketMQ中獲取消息消費(fèi),消費(fèi)成功之后,整個(gè)流程結(jié)束

RocketMQ為了減少磁盤(pán)的IO,會(huì)先將消息寫(xiě)入到os cache中,而不是直接寫(xiě)入到磁盤(pán)中,消費(fèi)者從os cache中獲取消息類(lèi)似于直接從內(nèi)存中獲取消息,速度更快,過(guò)一段時(shí)間會(huì)由os線程異步的將消息刷入磁盤(pán)中,此時(shí)才算真正完成了消息的持久化。在這個(gè)過(guò)程中,如果消息還沒(méi)有完成異步刷盤(pán),RocketMQ中的Broker宕機(jī)的話,就會(huì)導(dǎo)致消息丟失 如果消息已經(jīng)被刷入了磁盤(pán)中,但是數(shù)據(jù)沒(méi)有做任何備份,一旦磁盤(pán)損壞,那么消息也會(huì)丟失

首先生產(chǎn)者發(fā)送half消息到RocketMQ中,此時(shí)消費(fèi)者是無(wú)法消費(fèi)half消息的,若half消息就發(fā)送失敗了,則執(zhí)行相應(yīng)的回滾邏輯 half消息發(fā)送成功之后,且RocketMQ返回成功響應(yīng),則執(zhí)行生產(chǎn)者的核心鏈路 如果生產(chǎn)者自己的核心鏈路執(zhí)行失敗,則回滾,并通知RocketMQ刪除half消息 如果生產(chǎn)者的核心鏈路執(zhí)行成功,則通知RocketMQ commit half消息,讓消費(fèi)者可以消費(fèi)這條數(shù)據(jù)
https://blog.csdn.net/LO_YUN/article/details/101673893
//注冊(cè)消息監(jiān)聽(tīng)器處理消息
consumer.registerMessageListener(new?MessageListenerConcurrently()?{
???@Override
????public?ConsumeConcurrentlyStatus?consumeMessage(List?msgs,?ConsumeConcurrentlyContext?context) {??????????????????????????????????
????????//對(duì)消息進(jìn)行處理
????????return?ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
????}
});
//注冊(cè)消息監(jiān)聽(tīng)器處理消息
consumer.registerMessageListener(new?MessageListenerConcurrently()?{
???@Override
????public?ConsumeConcurrentlyStatus?consumeMessage(List?msgs,?ConsumeConcurrentlyContext?context) {?
?????//開(kāi)啟子線程異步處理消息
?????new?Thread()?{
???public?void?run()?{
????//對(duì)消息進(jìn)行處理
???}
??}.start();?????????????????????????????????
????????return?ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
????}
});
使用事務(wù)機(jī)制傳輸消息,會(huì)比普通的消息傳輸多出很多步驟,耗費(fèi)性能 同步刷盤(pán)相比異步刷盤(pán),一個(gè)是存儲(chǔ)在磁盤(pán)中,一個(gè)存儲(chǔ)在內(nèi)存中,速度完全不是一個(gè)數(shù)量級(jí) 主從機(jī)構(gòu)的話,需要Leader將數(shù)據(jù)同步給Follower 消費(fèi)時(shí)無(wú)法異步消費(fèi),只能等待消費(fèi)完成再通知RocketMQ消費(fèi)完成
最后免費(fèi)給大家分享50個(gè)Java項(xiàng)目實(shí)戰(zhàn)資料,涵蓋入門(mén)、進(jìn)階各個(gè)階段學(xué)習(xí)內(nèi)容,可以說(shuō)非常全面了。大部分視頻還附帶源碼,學(xué)起來(lái)還不費(fèi)勁!
附上截圖。(下面有下載方式)。
項(xiàng)目領(lǐng)取方式:
掃描下方公眾號(hào)回復(fù):50,
可獲取下載鏈接
???
?長(zhǎng)按上方二維碼?2 秒 回復(fù)「50」即可獲取資料 點(diǎn)贊是最大的支持?
評(píng)論
圖片
表情







