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.rhkb.cn/news/479468.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

transformer学习笔记-神经网络原理

在深度学习领域,transformer可以说是在传统的神经网络的基础上发展而来,着重解决传统神经网络长距离关联、顺序处理、模型表达能力等问题。 在学习transformer之前,我想,有必要先对传统的神经网络做简要的了解。 一、神经网络基本…

【前端】JavaScript中的字面量概念与应用详解

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 💯前言💯字面量1. 数字字面量2. 字符串字面量3. 布尔字面量4. 空值字面量(null)5. 对象字面量6. 数组字面量7. 正则表达式字面量8. 特殊值字面量9. 函数字…

字节跳动青训营刷题笔记19

问题描述 小R正在组织一个比赛,比赛中有 n 支队伍参赛。比赛遵循以下独特的赛制: 如果当前队伍数为 偶数,那么每支队伍都会与另一支队伍配对。总共进行 n / 2 场比赛,且产生 n / 2 支队伍进入下一轮。如果当前队伍数为 奇数&…

Python中的简单爬虫

文章目录 一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务器和浏览器的通讯流程3. 浏览器访问Web服务器的通讯流程4. 加载图片资源代码 二. 基于Web请求的FastAPI通用配置1. 目前Web服务器存在问题2. 基于Web请求的FastAPI通用配置 三. Python爬虫介绍1. 什…

【ArcGISPro】使用AI提取要素-土地分类(sentinel2)

Sentinel2数据处理 【ArcGISPro】Sentinel-2数据处理-CSDN博客 土地覆盖类型分类 处理结果

WinForm 的Combox下拉框 在FlatStyle.Flat的边框设置

现象:Combox在设置FlatStyle.Flat时边框不见了 效果: 解决问题思路封装新控件: public class DBorderComboBox : ComboBox {private const int WM_PAINT 0xF;[Browsable(true)][Category("Appearance")][Description("边框…

Python 爬虫入门教程:从零构建你的第一个网络爬虫

网络爬虫是一种自动化程序,用于从网站抓取数据。Python 凭借其丰富的库和简单的语法,是构建网络爬虫的理想语言。本文将带你从零开始学习 Python 爬虫的基本知识,并实现一个简单的爬虫项目。 1. 什么是网络爬虫? 网络爬虫&#x…

使用UE5.5的Animator Kit变形器

UE5.5版本更新了AnimatorKit内置插件,其中包含了一些内置变形器,可以辅助我们的动画制作。 操作步骤 首先打开UE5.5,新建第三人称模板场景以便测试,并开启AnimatorKit组件。 新建Sequence,放入测试角色 点击角色右…

Uniapp 安装安卓、IOS模拟器并调试

一、安装Android模拟器并调试 1. 下载并安装 Android Studio 首先下载 Mac 环境下的 Android Studio 的安装包,为dmg 格式。 下载完将Android Studio 向右拖拽到Applications中,接下来等待安装完成就OK啦! 打开过程界面如下图所示&#xf…

shell(5)字符串运算符和逻辑运算符

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

【金蝶双线指标】以看资金进出操作为主,兼顾波段跟踪和短线低吸

如上图,个股副图指标,大佬资金监控短线低吸攻击线操盘线趋势红蝴蝶,五大功能于一体。下面慢慢给大家仔细分享。 大佬资金监控指标,红绿进出,绿色缩小到极致,接近零轴,红绿柱分界线,为…

多输入多输出 | Matlab实现TCN-GRU时间卷积神经网络结合门控循环单元多输入多输出预测

多输入多输出 | Matlab实现TCN-GRU时间卷积神经网络结合门控循环单元多输入多输出预测 目录 多输入多输出 | Matlab实现TCN-GRU时间卷积神经网络结合门控循环单元多输入多输出预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现TCN-GRU时间卷积…

HCIA笔记4--VLAN划分

1. vlan是什么 vlan: virtual lan; 虚拟局域网的简称。 主要目的是隔离广播域。 2. vlan报文格式 在普通的以太网数据帧开关的12字节后添加4字节的vlan tag。而来区分vlan的是其中的vid部分12个比特位,范围自然就是0~2^12-1(0~4095); 0 4095保留使用。实际使用的是…

蓝牙定位的MATLAB仿真程序|基于信号强度的定位,平面、四个蓝牙基站(附源代码)

这段代码通过RSSI信号强度实现了蓝牙定位,展示了如何使用锚点位置和测量的信号强度来估计未知点的位置。它涵盖了信号衰减模型、距离计算和最小二乘法估计等基本概念。通过图形化输出,用户可以直观地看到真实位置与估计位置的关系。 文章目录 蓝牙定位原…

基于Springboot企业级工位管理系统【附源码】

基于Springboot企业级工位管理系统 效果如下: 系统登录页面 员工主页面 部门信息页面 员工管理页面 部门信息管理页面 工位信息管理页面 工位分配管理页面 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及,互联网成为人们查找信息的重要场所。…

Spring Boot教程之十: 使用 Spring Boot 实现从数据库动态下拉列表

使用 Spring Boot 实现从数据库动态下拉列表 动态下拉列表(或依赖下拉列表)的概念令人兴奋,但编写起来却颇具挑战性。动态下拉列表意味着一个下拉列表中的值依赖于前一个下拉列表中选择的值。一个简单的例子是三个下拉框,分别显示…

SpringBoot源码-spring boot启动入口ruan方法主线分析(一)

一、SpringBoot启动的入口 1.当我们启动一个SpringBoot项目的时候,入口程序就是main方法,而在main方法中就执行了一个run方法。 SpringBootApplication public class StartApp {public static void main(String[] args) {// testSpringApplication.ru…

AI 助力开发新篇章:云开发 Copilot 深度体验与技术解析

本文 一、引言:技术浪潮中的个人视角1.1 AI 和低代码的崛起1.2 为什么选择云开发 Copilot? 二、云开发 Copilot 的核心功能解析2.1 自然语言驱动的低代码开发2.1.1 自然语言输入示例2.1.2 代码生成的模块化支持 2.2 实时预览与调整2.2.1 实时预览窗口功能…

vscode的markdown扩展问题

使用vscode编辑markdown文本时,我是用的是Office Viewer(Markdown Editor)这个插件 今天突然发现不能用了,点击切换编辑视图按钮时会弹出报错信息: command office.markdown.switch not found 在网上找了很久发现没有有关这个插件的文章………

从零开始学 Maven:简化 Java 项目的构建与管理

一、关于Maven 1.1 简介 Maven 是一个由 Apache 软件基金会开发的项目管理和构建自动化工具。它主要用在 Java 项目中,但也可以用于其他类型的项目。Maven 的设计目标是提供一种更加简单、一致的方法来构建和管理项目,它通过使用一个标准的目录布局和一…