服务器确保不丢消息,Rabbitmq如何保证消息不丢失

本文详细阐述了如何在RabbitMQ中实现消息的生产者确认、服务器持久化和消费者确认机制,以防止数据丢失。通过配置durable队列、确认应答和持久化策略,确保消息在各种故障场景下的可靠性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.设计思路

054896eeaf9a

2.方案说明

2.1 生产者提交给消息服务器时,使用确认机制

channel.confirmSelect();

…………

if (channel.waitForConfirms()) {

System.out.println("发送消息成功");

} else {

System.out.println("发送消息失败");

}

生产者收不到确认的情况:

1)、MQ挂了

2)、MQ满了,

解决办法:每次的生产者消息发送都通过日志表记录下来,后续采用手动补偿即可

2.2 消息服务器对应的队列、交换机等都持久化,保证数据的不丢失

1)、代码设置

2)、控制平台设置---默认都是持久化的。临时的话重启后就会消失

durable是否持久化 durable为持久化、 Transient 不持久化

autoDelete 是否自动删除,当最后一个消费者断开连接之后队列是否自动被删除,可以通过RabbitMQ Management,查看某个队列的消费者数量,当consumers = 0时队列就会自动删除

054896eeaf9a

如果已经设置了持久化,则给生产者确认的时候就是持久化成功后的确认。这样就算硬盘坏了、持久化的过程断电了,都不会影响到消息的丢失,因为生产者收不到确认证明没发送成功。

2.3 消费者采用消息确认机制,保证数据的不丢失

1)、消息队列到消费者的方式有首次主动拉取、后续生产者发送时的主动推送和消费者发生异常时的重试三种方式。

2)、消息应答的方式默认为自动,即消费者收到消息时,队列即删除。如果消费者出现了断电等情况,也会被直接删除。所以要改成手动确认删除后,队列才会真正删除,这样保证了消息的不丢失。

channel.basicConsume(QUEUE_NAME, false, defaultConsumer);

注:第二个参数值为false代表关闭RabbitMQ的自动应答机制,改为手动应答。

在处理完消息时,返回应答状态,true表示为自动应答模式。

channel.basicAck(envelope.getDeliveryTag(), false);

3.Rabbitmq如何开启持久化的功能

默认的情况下mq服务器端创建队列和交换机都是持久化的

如果是代码创建的话,将该值设置为durablet

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值