Spring boot 实践Rabbitmq消息防丢失

本文通过实践探讨防止Spring Boot应用在使用RabbitMQ时消息丢失的方法,包括确认(Confirm)机制、返回(Return)机制以及手动ACK确认消费。详细介绍了各种情况下的解决方案,如发送失败、RabbitMQ服务挂机以及消费端异常处理。
摘要由CSDN通过智能技术生成

之前看很多网上大佬的防丢失的文章,文章中理论知识偏多,所以自己想着实践一下,实践过程中也踩了一些坑,因此写出了这篇文章。如果文章有误人子弟的地方,望在评论区指出。

导致消息出现丢失的原因

  1. 发送时失败,指发送端发送完消息准备到达消息队列的过程中,因网络波动、消息队列服务宕机等,消息队列服务无法接收消息,所以导致了丢失。

  2. 到达时宕机,消息队列服务接收到消息之后,如果没有开启持久化,消息会存储在内存中(当然内存吃紧的话,也会转入磁盘,缓解内存),如果这个时候服务挂了,那么内存中的消息就会丢失。

  3. 发送到消费端失败,消费端接收到了消息的时候,消费端服务挂了,而rabbitmq默认自动ack,也就是说rabbitmq发送到消费端,一旦认定了消费端接收了,无论有无消费成功,rabbitmq都认为是发送成功。

下面我们以这三种情况进行实践。

环境

jdk1.8 Spring boot 2.3.7.RELEASE Spring-boot-starter-amqp 2.3.7.RELEASE Rabbitmq 3.7.7

准备工作

我事先准备了好了交换机以及队列

  • 交换机:message.log.test.exchange和message.log.test2.exchange

  • 队列:message.loss.test.queue

其中message.loss.test.queue和message.log.test.exchange是绑定关系,而 message.log.test2.exchange没有绑定队列

1.发送时失败

发送时失败,rabbitmq有两种情况是属于发送时失败。

  1. 消息未到rabbitmq的交换机(exchange)

  2. 消息到达了rabbitmq的交换机(exchange),但是没有到达队列(queue)

第一种的解决方式是使用confirm机制。第二种解决方式则是使用return机制。

使用confirm机制

模拟场景

confirm机制是当发送端的消息没有到达rabbitmq的交换机(exchange)时,会触发confirm方法,告诉发送端该消息没有到达rabbitmq,需要做业务处理。 这里我们发送消息到rabbitmq不存在的交换机上,就可以模拟上述场景。

实现RabbitTemplate.ConfirmCallback接口

/**
 * 当消息没有到达Rabbitmq的交换机时触发该方法(当然到达了也会触发,)
 */
@Component
publi
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值