1.消息持久化
①交換機(jī)的持久化(在消息接收方的方法上的@RabbitListener(bindings = @QueueBinding(...))
注解中定義)
value = @Queue(value = "xx.xx.xx", durable = "true")
②隊(duì)列的持久化(默認(rèn)就是持久化的)
exchange = @Exchange(value = "xx.xx.xx",ignoreDeclarationExceptions = "true",type = "topic")
③消息的持久化(deliveryMode=2)
默認(rèn)調(diào)用amqpTemplate的convertAndSend()
方法默認(rèn)配置消息就是持久化的
2.Confirm消息確認(rèn)機(jī)制
①發(fā)布確認(rèn)(在配置文件中配置)
原理:在消息生產(chǎn)端發(fā)送一條消息到MQ的時(shí)候,MQ接收到之后會(huì)返回一條確認(rèn)信息給生產(chǎn)端
spring:
rabbitmq:
publisher-confirms: true
②接收確認(rèn)(在配置文件中配置)
原理:在消息接收端從MQ接收到一條消息的時(shí)候筛圆,接收端會(huì)返回一條確認(rèn)信息給MQ
spring:
rabbitmq:
publisher-returns: true
3.ACK確認(rèn)機(jī)制
在MQ將消息傳遞給消費(fèi)端時(shí)胚迫,默認(rèn)情況下會(huì)在發(fā)送之后自動(dòng)將該消息進(jìn)行確認(rèn)并刪除胸梆,這樣的話磅摹,如果消息在MQ發(fā)送給消費(fèi)端的過(guò)程中發(fā)生了差錯(cuò)碧查,就沒(méi)有辦法來(lái)獲取出現(xiàn)問(wèn)題的消息却妨,那么此時(shí)我們可以手動(dòng)設(shè)置ACK的確認(rèn)機(jī)制
# 該模式有三種方式:1.自動(dòng)確認(rèn) none 2.根據(jù)情況確認(rèn) auto 3.手動(dòng)確認(rèn) manual
spring:
rabbitmq:
listener:
simple:
acknowledge-mode: manual
添加完配置之后反璃,再接收到確認(rèn)信息的時(shí)候手動(dòng)進(jìn)行確認(rèn)
channel.basicAck(deliveryTag,false);
4.消息補(bǔ)償機(jī)制
- ①消息入庫(kù)
(1)在消息發(fā)出之前,將該信息保存到一個(gè)數(shù)據(jù)庫(kù)中秃臣,為該信息添加一個(gè)status
的字段涧衙,并設(shè)為0
(2)當(dāng)收到發(fā)布確認(rèn)
的確認(rèn)信息時(shí),將上述的字段設(shè)為1
(3)同時(shí)對(duì)于長(zhǎng)時(shí)間狀態(tài)為0的消息進(jìn)行額外處理(重發(fā)/寫入日志)