如何保证RabbitMQ重启后消息不丢失
这篇文章主要介绍了如何保证RabbitMQ重启后消息不丢失的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇如何保证RabbitMQ重启后消息不丢失文章都会有所收获,下面我们一起来看看吧。
1.设计思路
2.方案说明
(1)生产者提交给消息服务器时,使用确认机制
channel.confirmSelect(); …………if (channel.waitForConfirms()) { System.out.println("发送消息成功"); } else { System.out.println("发送消息失败"); }
生产者收不到确认的情况:
1)MQ挂了
2)MQ满了,
解决办法:每次的生产者消息发送都通过日志表记录下来,后续采用手动补偿即可
(2)消息服务器对应的队列、交换机等都持久化,保证数据的不丢失
1)代码设置
2)控制平台设置---默认都是持久化的。临时的话重启后就会消失
durable是否持久化 durable为持久化、 Transient 不持久化
autoDelete 是否自动删除,当最后一个消费者断开连接之后队列是否自动被删除,可以通过RabbitMQ Management,查看某个队列的消费者数量,当consumers = 0时队列就会自动删除
如果已经设置了持久化,则给生产者确认的时候就是持久化成功后的确认。这样就算硬盘坏了、持久化的过程断电了,都不会影响到消息的丢失,因为生产者收不到确认证明没发送成功。
(3)消费者采用消息确认机制,保证数据的不丢失
1)消息队列到消费者的方式有首次主动拉取、后续生产者发送时的主动推送和消费者发生异常时的重试三种方式。
2)消息应答的方式默认为自动,即消费者收到消息时,队列即删除。如果消费者出现了断电等情况,也会被直接删除。所以要改成手动确认删除后,队列才会真正删除,这样保证了消息的不丢失。
channel.basicConsume(QUEUE_NAME, false, defaultConsumer); 注:第二个参数值为false代表关闭RabbitMQ的自动应答机制,改为手动应答。 在处理完消息时,返回应答状态,true表示为自动应答模式。 channel.basicAck(envelope.getDeliveryTag(), false);
3.Rabbitmq如何开启持久化的功能
(1)默认的情况下mq服务器端创建队列和交换机都是持久化的
(2)如果是代码创建的话,将该值设置为durablet
关于“如何保证RabbitMQ重启后消息不丢失”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“如何保证RabbitMQ重启后消息不丢失”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注蜗牛博客行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。
评论