消息隊(duì)列在使用過程中,面臨著很多實(shí)際問題需要思考:
??
?
一、消息可靠性
消息從發(fā)送,到消費(fèi)者接收,會(huì)經(jīng)理多個(gè)過程:
其中的每一步都可能導(dǎo)致消息丟失,常見的丟失原因包括:
-
發(fā)送時(shí)丟失:
-
生產(chǎn)者發(fā)送的消息未送達(dá)exchange
-
消息到達(dá)exchange后未到達(dá)queue
-
-
MQ宕機(jī),queue將消息丟失
-
consumer接收到消息后未消費(fèi)就宕機(jī)
針對(duì)這些問題,RabbitMQ分別給出了解決方案:
-
生產(chǎn)者確認(rèn)機(jī)制
-
mq持久化
-
消費(fèi)者確認(rèn)機(jī)制
-
失敗重試機(jī)制
?
二、生產(chǎn)者消息確認(rèn)
RabbitMQ提供了publisher confirm機(jī)制來避免消息發(fā)送到MQ過程中丟失。這種機(jī)制必須給每個(gè)消息指定一個(gè)唯一ID。消息發(fā)送到MQ以后,會(huì)返回一個(gè)結(jié)果給發(fā)送者,表示消息是否處理成功。
返回結(jié)果有兩種方式:
-
publisher-confirm,發(fā)送者確認(rèn)
-
消息成功投遞到交換機(jī),返回ack
-
消息未投遞到交換機(jī),返回nack
-
-
publisher-return,發(fā)送者回執(zhí)
-
消息投遞到交換機(jī)了,但是沒有路由到隊(duì)列。返回ACK,及路由失敗原因。
-
?
?
?
2.1、修改配置
首先,修改publisher服務(wù)中的application.yml文件,添加下面的內(nèi)容:
spring:
rabbitmq:
publisher-confirm-type: correlated
publisher-returns: true
template:
mandatory: true
說明:
-
publish-confirm-type
:開啟publisher-confirm,這里支持兩種類型:-
simple
:同步等待confirm結(jié)果,直到超時(shí) -
correlated
:異步回調(diào),定義ConfirmCallback,MQ返回結(jié)果時(shí)會(huì)回調(diào)這個(gè)ConfirmCallback
-
-
publish-returns
:開啟publish-return功能,同樣是基于callback機(jī)制,不過是定義ReturnCallback -
template.mandatory
:定義消息路由失敗時(shí)的策略。true,則調(diào)用ReturnCallback;false:則直接丟棄消息
?
2.2、定義Return回調(diào)
每個(gè)RabbitTemplate只能配置一個(gè)ReturnCallback,因此需要在項(xiàng)目加載時(shí)配置:文章來源:http://www.zghlxwxcb.cn/news/detail-622077.html
修改publis文章來源地址http://www.zghlxwxcb.cn/news/detail-622077.html
到了這里,關(guān)于RabbitMQ --- 消息可靠性的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!