自学内容网 自学内容网

MQ高级2:MQ的可靠性

欢迎来到“雪碧聊技术”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的知识,请关注本博主~~


原文地址:https://blog.csdn.net/qq_63981644/article/details/144067192

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!