当前位置: 首页 > article >正文

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的知识,请关注本博主~~


http://www.kler.cn/a/414775.html

相关文章:

  • C++ 【异步日志模块和std::cout << 一样使用习惯替代性好】 使用示例,后续加上远程日志
  • Leetcode:349. 两个数组的交集
  • systemverilog约束中:=和:/的区别
  • ELK(Elasticsearch + logstash + kibana + Filebeat + Kafka + Zookeeper)日志分析系统
  • PHP 去掉特殊不可见字符 “\u200e“
  • C++设计模式:桥接模式(Bridge)
  • 鸿蒙开发-在ArkTS中制作音乐播放器
  • GDPU Android移动应用 数据存储
  • [Redis#5] hash | 命令 | 内部编码 | 应用 | cache: string, json, hash对比
  • 英语-日常笔记
  • 大数据 HDFS和MapReduce综合实训
  • BAT WPS OFFICE免登录工具
  • hadoop_zookeeper详解
  • 云原生时代的轻量级反向代理Traefik
  • 《C++搭建神经网络基石:开启智能编程新征程》
  • IDEA 2024 Maven 设置为全局本地仓库,避免新建项目重新配置maven
  • 2024-11-25 二叉树的定义
  • Java基础之控制语句:开启编程逻辑之门
  • 国外媒体发布新闻稿/海外媒体网站发稿创历史新潮流
  • C# 基于WPF实现数据记录导出excel
  • COMSOL工作站:配置指南与性能优化
  • 单片机知识总结(完整)
  • 网络安全概论——网络加密与密钥管理
  • MTK 展锐 高通 sensorhub架构
  • 蓝桥杯备赛笔记(一)
  • python中的判断语句