欢迎来到“雪碧聊技术”CSDN博客!
在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将不断探索Java的深邃世界,分享最新的技术动态、实战经验以及项目心得。
让我们一同在Java的广阔天地中遨游,携手提升技术能力,共创美好未来!感谢您的关注与支持,期待在“雪碧聊技术”与您共同成长!
目录
前言
一、MQ的可靠性
1、演示MQ的不可靠
①向一个队列中,存储一条消息
②重启docker容器(重启rabbitMQ进程),模拟rabbitMQ宕机
③再次查看队列中的消息还是否存在
2、导致MQ不可靠的原因:RabbitMQ是基于内存存储消息
①一旦MQ宕机,内存中的消息就会消失
②内存空间有限,当消费者故障或处理速度太慢使,会导致消息积压,引发MQ阻塞。
3、演示paged out(将rabbitMQ内存的消息满了以后,rabbitMQ会把老的消息放入磁盘,但这个过程会导致MQ阻塞)
①先声明一点:只有往队列中发送临时消息,才会出现paged out现象,因为临时消息是往内存中存的,内存满了才往磁盘存。而持久消息就会直接往磁盘进行持久化。
②演示:往rabbitMQ的队列中,发送一百万条临时消息
③演示:往rabbitMQ的队列中,发送一百万条持久消息
4、如何解决MQ的不可靠问题?
①数据持久化(早期的解决方案)
②Lazy Queue(最新的解决方案)
二、解决方式一:数据持久化
1、RabbitMQ实现数据持久化包括3个方面
①交换机持久化
举例:
②队列持久化
举例:
③消息持久化
举例:
2、注意
①使用rabbitMQ控制台:
②使用SpringAMQP:
3、数据持久化有什么用
举例:
三、解决方式2:Lazy Queue
1、什么是Lazy Queue?
2、Lazy Queue(惰性队列)的特点
①接收到消息后,直接存入磁盘,而不是内存。(内存只保留最近的消息,默认2048条)
②消费者要消费消息时,才会从磁盘中读取消息并加载到内存。
③支持数百万条的消息存储
3、如何将一个队列设置成Lazy Queue模式?
①在rabbitMQ控制台
②通过java代码(非注解)
③通过java代码(注解)
四、总结
前言
通过本专栏【RabbitMQ】的上一篇文章【MQ高级1:消息可靠性问题、生产者可靠性】,我们已经解决了如何确保生产者成功将消息发送到MQ(交换机+队列)。
那么本篇文章要解决的问题就是如何保证MQ的可靠性,即:使消息队列不丢失消息。
一、MQ的可靠性
1、演示MQ的不可靠
①向一个队列中,存储一条消息
点进队列object.queue中,往该队列中添加一条消息,如下:
②重启docker容器(重启rabbitMQ进程),模拟rabbitMQ宕机
# 重启mq容器,模拟rabbitMQ宕机
docker restart mq
③再次查看队列中的消息还是否存在
2、导致MQ不可靠的原因:RabbitMQ是基于内存存储消息
在默认情况下,RabbitMQ会将接收到的信息保存在内存中,以降低消息收发的延迟。但这样会导致两个问题:
①一旦MQ宕机,内存中的消息就会消失
比如我们重启docker容器(重启rabbitMQ进程),来模拟rabbitMQ宕机,此时就会导致队列中的所有消息都会丢失。
因为rabbitMQ存储消息在内存中,而内存的特点就是:断电丢失数据。
②内存空间有限,当消费者故障或处理速度太慢使,会导致消息积压,引发MQ阻塞。
解释:当rabbitMQ的内存充满了消息后,rabbitMQ会把老的消息放入磁盘,但这个过程会导致MQ阻塞(即:在Java中访问不到rabbitMQ服务了,因为rabbitMQ忙着把消息放到磁盘呢。即:这个解决消息积压的过程是同步的,不是异步的,因此会阻塞Java的rabbitMQ请求)。
上述rabbitMQ会把老的消息放入磁盘,这个过程叫做pageout。
因此结论是:一旦rabbitMQ发生paged out,rabbitMQ就会进入阻塞状态,此时java客户端是无法访问rabbitMQ服务的。
3、演示paged out(将rabbitMQ内存的消息满了以后,rabbitMQ会把老的消息放入磁盘,但这个过程会导致MQ阻塞)
①先声明一点:只有往队列中发送临时消息,才会出现paged out现象,因为临时消息是往内存中存的,内存满了才往磁盘存。而持久消息就会直接往磁盘进行持久化。
②演示:往rabbitMQ的队列中,发送一百万条临时消息
观察object.queue队列的消息处理情况:
③演示:往rabbitMQ的队列中,发送一百万条持久消息
4、如何解决MQ的不可靠问题?
①数据持久化(早期的解决方案)
②Lazy Queue(最新的解决方案)
二、解决方式一:数据持久化
1、RabbitMQ实现数据持久化包括3个方面
①交换机持久化
举例:
②队列持久化
举例:
③消息持久化
举例:
2、注意
①使用rabbitMQ控制台:
在创建交换机和队列时,默认都是持久的,因此上面持久化的前两点不用我们手动操作,我们知道有这么回事即可。而发送消息时,默认消息是临时的。
②使用SpringAMQP:
创建交换机、队列,发送消息,都是持久的。
3、数据持久化有什么用
举例:
还是上面提到的,往队列发送持久消息时,是直接往磁盘存储的,因此不会产生paged out现象,也就不会导致mq阻塞。
三、解决方式2:Lazy Queue
1、什么是Lazy Queue?
lazy queue是从RabbitMQ的3.6.0版本开始出现的。叫做“惰性队列”。
2、Lazy Queue(惰性队列)的特点
①接收到消息后,直接存入磁盘,而不是内存。(内存只保留最近的消息,默认2048条)
②消费者要消费消息时,才会从磁盘中读取消息并加载到内存。
③支持数百万条的消息存储
注意:在3.12版本后,所有队列都是Lazy Queue模式的,无法更改。
3、如何将一个队列设置成Lazy Queue模式?
①在rabbitMQ控制台
②通过java代码(非注解)
③通过java代码(注解)
四、总结
以上就是MQ可靠性的全部相关内容,想了解更多关于RabbitMQ的知识,请关注本博主~~