一、生產(chǎn)端-可靠性投遞
解決方案:消息落庫午阵,對消息狀態(tài)進(jìn)行打標(biāo)
為確保消息可靠性發(fā)送闷串,在業(yè)務(wù)處理完后,生產(chǎn)端發(fā)送消息時(shí)消息落庫(最好保證業(yè)務(wù)和消息落地在同一事務(wù))漂辐,發(fā)送給MQ后收到MQ的確認(rèn)消息時(shí)泪喊,標(biāo)記消息已發(fā)送成功。若生產(chǎn)端接口確認(rèn)消息時(shí)髓涯,網(wǎng)絡(luò)中斷導(dǎo)致無法收到確認(rèn)消息袒啼,此時(shí)需要做補(bǔ)償操作,使用分布式定時(shí)任務(wù)纬纪,掃描未標(biāo)記成功發(fā)送的消息蚓再,重新發(fā)送或其他操作。
二包各、消費(fèi)端-冪等性保障
在海量訂單產(chǎn)生的業(yè)務(wù)高峰期摘仅,如何避免消息的重復(fù)消費(fèi)問題?
業(yè)界主流的冪等性操作:業(yè)務(wù)唯一ID或指紋碼機(jī)制问畅,利用數(shù)據(jù)庫主鍵去重娃属。
三矾端、生產(chǎn)端-確認(rèn)機(jī)制
1.Confirm消息確認(rèn)機(jī)制
消息的確認(rèn),是指生產(chǎn)者投遞消息后卵皂,如果broker收到消息秩铆,則會(huì)給生產(chǎn)者一個(gè)應(yīng)答
生產(chǎn)者進(jìn)行接收應(yīng)答,用來確定這條消息是否正常的發(fā)送到broker,這種方式也是消息的可靠性投遞的核心保障
2.Confirm確認(rèn)消息的實(shí)現(xiàn)
? ? 第一步:在channel上開啟確認(rèn)模式:change.confirmSelect();
? ? 第二步:在channel上添加監(jiān)聽:addConfirmListener殴玛,監(jiān)聽成功和失敗的返回結(jié)果捅膘,根據(jù)具體的結(jié)果對消息進(jìn)行重新發(fā)送或記錄日志等后續(xù)處理。
四滚粟、生產(chǎn)端-返回機(jī)制
1.Return消息機(jī)制
Return Listener用于處理一些不可路由的消息
我們的消息生產(chǎn)者寻仗,通過指定一個(gè)Exchange和Routingkey,把消息送到某一個(gè)隊(duì)列中去凡壤,然后我們的消費(fèi)者監(jiān)聽隊(duì)列愧沟,進(jìn)行消費(fèi)處理
但是在某些情況下,如果我們在發(fā)送消息的時(shí)候鲤遥,當(dāng)前的exchange不存在或者指定的routingkey路由不到,這個(gè)時(shí)候如果我們需要監(jiān)聽這種不可達(dá)的消息林艘,就要使用Return Listener
2.實(shí)現(xiàn)
第一步:發(fā)送消息時(shí)盖奈,設(shè)置Mandatory:如果為true,則監(jiān)聽器會(huì)接收到路由不可達(dá)的消息 狐援,然后進(jìn)行后續(xù)處理钢坦,如果為false,那么broker端自動(dòng)刪除該消息
第二部:在channel上添加監(jiān)聽:addReturnListener啥酱,監(jiān)聽一些不可路由的消息爹凹,后續(xù)記錄日志或其他處理