1、什么情況會(huì)導(dǎo)致消息丟失???????
? ? ? ? ?a.發(fā)送時(shí)丟失:
?? ????????????????生產(chǎn)者發(fā)送的消息未送達(dá)exchange
? ?????????????????消息到達(dá)exchange后未到達(dá)queue
? ? ? ? b.MQ宕機(jī),queue將消息丟失
? ? ? ? c.consumer接收到消息后未消費(fèi)就宕機(jī)
2、如何保證息不丟失,就是分別避免每一個(gè)環(huán)節(jié)丟失
? ? ? ? a.保證生產(chǎn)者不丟消息
? ? ? ? b.保證rabbitmq不丟消息
? ? ? ? c.保證消費(fèi)端不丟消息
3、RabbitMQ生產(chǎn)者如何避免消息丟失?
? ? ? ? a.保證生產(chǎn)者不丟消息,要確保說寫rabbitmq的消息別丟,可以開啟。
? ? ? ? b.每次寫的消息都會(huì)分配一個(gè)唯一的id,如果寫入了rabbitmq中,rabbitmq會(huì)給你回傳一個(gè)ack消息,告訴你說這個(gè)消息ok了。
? ? ? ? c.如果rabbitmq沒能處理這個(gè)消息,會(huì)回調(diào)你一個(gè)nack接口,告訴你這個(gè)消息接收失敗,我們可以重試。
? ? ? ? (publisher-confirm,發(fā)送者確認(rèn)消息成功投遞到交換機(jī),返回ack;消息未投遞到交換機(jī),返回nack。publisher-return,發(fā)送者回執(zhí),消息投遞到交換機(jī),但是沒有路由到隊(duì)列。返回ACK,及路由失敗原因。)
????????
4、如何實(shí)現(xiàn)消息持久化?(注意:SpringAMQP默認(rèn)已經(jīng)進(jìn)行持久化)
? ? ? ? a.保證rabbitmq不丟消息,開啟rabbitmq的持久化(持久化queue和message、exhange),設(shè)置不能自動(dòng)刪除
? ? ? ? b.交換機(jī)持久化? ?:? ?
? ? ? ? c.持久化queue,在創(chuàng)建queue的時(shí)候?qū)⑵湓O(shè)置為持久化的,這樣就可以保證rabbitmq持久化queue的元數(shù)據(jù),但是不會(huì)持久化queue里的數(shù)據(jù)。
? ? ? ? d.持久化Message,在發(fā)送消息的時(shí)候?qū)⑾⒌膁eliveryMode設(shè)置為2,就是將消息設(shè)置為持久化的,此時(shí)rabbitmq就會(huì)將消息持久化到磁盤上去。
4、消費(fèi)者有幾種確認(rèn)機(jī)制?
????????RabbitMQ支持消費(fèi)者確認(rèn)機(jī)制:消費(fèi)者處理消息后可以向MQ發(fā)送ack回執(zhí),MQ收到ack回執(zhí)后才會(huì)刪除該消息。SpringAMQP允許配置三種確認(rèn)模式:
? ? ? ? ? ? ? ? none:關(guān)閉ack,MQ假定消費(fèi)者獲取消息后會(huì)成功處理,因此消息投遞后立即被刪除。
? ? ? ? ? ? ? ? manual:手動(dòng)ack,需要在業(yè)務(wù)代碼結(jié)束后,調(diào)用api發(fā)送ack。
? ? ? ? ? ? ? ? auto:自動(dòng)ack,由spring監(jiān)測(cè)listener代碼是否出現(xiàn)異常,沒有異常返回ack;有異常返回nack(默認(rèn))。(注意:auto默認(rèn)方式,消費(fèi)者消息處理異常后消息會(huì)重新入隊(duì),如果消費(fèi)者一直異常則會(huì)一直死循環(huán)。)
????????方式是修改application.yml文件,添加下面配置:? ? ? ? ? ? ??
5、消費(fèi)者消費(fèi)失敗后如何解決死循環(huán)導(dǎo)致MQ壓力大?(注意:重試次數(shù)達(dá)到后,消息被丟棄。)
????????當(dāng)消費(fèi)者出現(xiàn)異常后,消息會(huì)不斷requeue(重新入隊(duì))到隊(duì)列,再重新發(fā)送給消費(fèi)者,然后再次異常,再次requeue,無限循環(huán),導(dǎo)致mq的消息處理飆升,帶來不必要的壓力:
????????我們可以利用Spring的retry機(jī)制,在消費(fèi)者出現(xiàn)異常時(shí)利用本地重試,而不是無限制的requeue到mq隊(duì)列。
????????開啟Spring本地重試模式后,重試次數(shù)耗盡,如果消息依然失敗,則需要有MessageRecoverer接口來處理,它包含三種不同的實(shí)現(xiàn):
? ? ? ? a.RejectAndDontRequeueRecoverer:重試耗盡后,直接reject,丟棄消息。默認(rèn)就是這種方式。
? ? ? ? b.ImmediateRequeueMessageRecoverer:重試耗盡后,返回nack,消息重新入隊(duì)。
? ? ? ? c.RepublishMessageRecoverer:重試耗盡后,將失敗消息投遞到指定的交換機(jī)(推薦使用)。? ? ? ?
????????測(cè)試下RepublishMessageRecoverer處理模式:
????????創(chuàng)建配置類ErrorMessageConfig,定義接收失敗消息的交換機(jī)、隊(duì)列及其綁定關(guān)系:????????????????然后,定義RepublishMessageRecoverer:????????
6、如何確保RabbitMQ消息的可靠性(面試)?????????
????????1.開啟生產(chǎn)者確認(rèn)機(jī)制,確保生產(chǎn)者的消息能到達(dá)隊(duì)列
????????2.開啟持久化功能,確保消息未消費(fèi)前在隊(duì)列中不會(huì)丟失
????????3.開啟消費(fèi)者確認(rèn)機(jī)制為auto,由spring確認(rèn)消息處理成功后完成ack
????????4.開啟消費(fèi)者失敗重試機(jī)制,配置重試次數(shù)、重試時(shí)間文章來源:http://www.zghlxwxcb.cn/news/detail-784769.html
????????5.改變默認(rèn)失敗重試策略,多次重試失敗后將消息投遞到異常交換機(jī),交由人工處理文章來源地址http://www.zghlxwxcb.cn/news/detail-784769.html
到了這里,關(guān)于RabbitMQ如何保證消息不丟失?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!