🌈hello,你好鸭,我是Ethan,西安电子科技大学大三在读,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文||一分钟看完我的几百篇博客
🔥温馨提示:划到文末发现专栏彩蛋 点击这里直接传送
🔥本篇概览:详细讲解了避免消息最终失败方案2——确保MQ的可靠性1——数据持久化。🌈⭕🔥
【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】
🔥 微服务全集
🔥 前一篇章
🌈引出
消息到达MQ以后,如果MQ不能及时保存,也会导致消息丢失,所以MQ的可靠性也非常重要。
早期使用的是这种模式,mq3.6之前是直接将消息放入磁盘来解决数据持久化的,之后是使用lazyqueue来解决的 。
2.MQ的可靠性
消息到达MQ以后,如果MQ不能及时保存,也会导致消息丢失,所以MQ的可靠性也非常重要。
2.1.数据持久化
为了提升性能,默认情况下MQ的数据都是在内存存储的临时数据,重启后就会消失。为了保证数据的可靠性,必须配置数据持久化,包括:
交换机持久化
队列持久化
消息持久化
我们以控制台界面为例来说明。
2.1.1.交换机持久化
在控制台的Exchanges
页面,添加交换机时可以配置交换机的Durability
参数:
(临时的,mq重启就没了。)
spring创建的话,默认是持久的。
设置为Durable
就是持久化模式,Transient
就是临时模式。
2.1.2.队列持久化
在控制台的Queues页面,添加队列时,同样可以配置队列的Durability
参数:
(临时的,mq重启就没了。)
spring创建的话,默认是持久的。
除了持久化以外,你可以看到队列还有很多其它参数,有一些我们会在后期学习。
2.1.3.消息持久化
在控制台发送消息的时候,可以添加很多参数,而消息的持久化(放入磁盘里面),是要配置一个properties
(注意Spring默认都是发的持久化的 ):
如果不是持久的,是临时的,重启后,消息就没了。
上面都是在控制台中,真实
我们平时写代码时,可以指定是持久化还是非持久化,
2.2代码演示
非持久化,pageOut
@Test
void testPageOut() {
Message message = MessageBuilder
.withBody("hello".getBytes(StandardCharsets.UTF_8))
.setDeliveryMode(MessageDeliveryMode.NON_PERSISTENT).build();
for (int i = 0; i < 1000000; i++) {
rabbitTemplate.convertAndSend("lazy.queue", message);
}
}
这段代码的含义是,向队列lazy.queue里面发送消息“hello” ,并指定持久化形式为非持久化。发了1百万条消息。消息会在先占满内存,最后如果内存空间不足了,在使用磁盘作为临时存储区,这个过程是阻塞的,叫做pageOut。其他消息进不来,所以会有消息速率下降的情况发生。
图示:
MQ展示消息速率
持久化
@Test
void testPageOut() {
Message message = MessageBuilder
.withBody("hello".getBytes(StandardCharsets.UTF_8))
.setDeliveryMode(MessageDeliveryMode.PERSISTENT).build();
for (int i = 0; i < 1000000; i++) {
rabbitTemplate.convertAndSend("lazy.queue", message);
}
}
费时间:
持久化比之前的慢了接近一倍。因为是往磁盘里面写.
接下来讲解一种更完美的方式:lazyqueue
2.3警告:
:::warning 说明:在开启持久化机制以后,如果同时还开启了生产者确认,那么MQ会在消息持久化以后才发送ACK回执,进一步确保消息的可靠性。 不过出于性能考虑,为了减少IO次数,发送到MQ的消息并不是逐条持久化到数据库的,而是每隔一段时间批量持久化。一般间隔在100毫秒左右,这就会导致ACK有一定的延迟,因此建议生产者确认全部采用异步方式。 :::
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏推荐
🌈🌈计算机科学入门系列 关注走一波💕💕
🌈🌈CSAPP深入理解计算机原理 关注走一波💕💕
🌈🌈微服务项目之黑马头条 关注走一波💕💕
🌈🌈redis深度项目之黑马点评 关注走一波💕💕
🌈🌈JAVA面试八股文系列专栏 关注走一波💕💕
🌈🌈JAVA基础试题集精讲 关注走一波💕💕
🌈🌈代码随想录精讲200题 关注走一波💕💕
总栏
🌈🌈JAVA基础要夯牢 关注走一波💕💕
🌈🌈JAVA后端技术栈 关注走一波💕💕
🌈🌈JAVA面试八股文 关注走一波💕💕
🌈🌈JAVA项目(含源码深度剖析) 关注走一波💕💕
🌈🌈计算机四件套 关注走一波💕💕
🌈🌈数据结构与算法 关注走一波💕💕
🌈🌈必知必会工具集 关注走一波💕💕
🌈🌈书籍网课笔记汇总 关注走一波💕💕
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!