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

理解RabbitMQ中的消息存储机制:非持久化、持久化与惰性队列(Lazy Queue)

文章目录

    • 1. 非持久化消息(Transient Messages)
      • 内存压力处理
    • 2. 持久化消息(Persistent Messages)
    • 3. 惰性队列(Lazy Queue)
      • 官方推荐
    • 总结

在RabbitMQ中,消息的存储和处理方式可以根据不同的需求进行配置。主要有三种消息存储机制:非持久化消息、持久化消息和惰性队列。本文将详细探讨这些机制及其应用场景,并解释为什么惰性队列现在是默认的推荐配置。

1. 非持久化消息(Transient Messages)

非持久化消息的特点如下:

  • 存储在内存中:非持久化消息在RabbitMQ中只存储在内存中,不会主动写入磁盘。这样的设计使得消息处理速度非常快,因为内存访问速度远快于磁盘访问。
  • 易失性:由于消息只存在于内存中,如果RabbitMQ服务器发生重启或崩溃,所有未处理的非持久化消息都会丢失。这种消息不具备数据持久性。
  • 适用场景:非持久化消息适用于对数据可靠性要求不高的场景,例如实时日志、临时通知、瞬时数据传输等。

内存压力处理

当非持久化消息大量堆积,导致内存压力过大时,RabbitMQ会采取以下措施:

  • 流控机制:RabbitMQ会启用流控机制,减缓或限制消息的接收速度,以保护系统稳定性。
  • 丢弃消息:在极端情况下,RabbitMQ可能会选择丢弃部分非持久化消息,以释放内存空间。
  • PageOut机制:当内存达到极限时,RabbitMQ可能会将部分非持久化消息写入磁盘(PageOut)以防止系统崩溃。这是一种极端情况下的保护措施。

2. 持久化消息(Persistent Messages)

持久化消息具有以下特点:

  • 内存和磁盘双重存储:持久化消息在接收时会同时存储在内存和磁盘中。这保证了即使RabbitMQ服务器重启或崩溃,消息也不会丢失。
  • 同步写入磁盘:持久化消息会同步写入磁盘,确保数据的持久性。这种机制虽然增加了一些处理延迟,但大大提高了消息的可靠性。
  • 适用场景:适用于需要确保消息不丢失的关键业务场景,如订单处理、交易信息等。

3. 惰性队列(Lazy Queue)

惰性队列是一种特殊的消息存储机制,专为处理大规模消息积压问题而设计。从RabbitMQ 3.6.0版本引入惰性队列以来,到3.12版本之后,惰性队列已经成为默认的队列类型。其特点如下:

  • 直接存入磁盘:惰性队列中的消息在接收时直接存入磁盘,而不是首先存入内存。这大大减少了内存的使用量。
  • 懒加载:只有在消费者准备消费消息时,消息才会从磁盘中读取并加载到内存中进行处理。
  • 支持大规模消息存储:惰性队列能够支持数百万条消息的存储,适用于高消息量和长时间积压的场景。
  • 降低内存压力:通过减少内存使用,避免了因消息积压导致的内存溢出问题,提高系统的稳定性。

官方推荐

从RabbitMQ 3.12版本开始,惰性队列成为默认队列类型。官方推荐将RabbitMQ升级到3.12版本或更高版本,以利用惰性队列的优势:

  • 提高系统稳定性:通过减少内存使用,惰性队列有效避免了因消息积压导致的内存压力问题。
  • 适应大规模消息堆积:惰性队列能够处理和存储大量消息,适用于需要高吞吐量的应用场景。
  • 优化资源使用:惰性队列使得系统资源利用更高效,特别是在消息量波动较大的情况下。

总结

  • 非持久化消息:仅存储在内存中,不会主动写入磁盘。适用于对可靠性要求不高、需要快速处理的场景。当内存压力过大时,可能触发流控或PageOut机制。
  • 持久化消息:同时存储在内存和磁盘中,确保消息的可靠性。适用于需要确保消息不丢失的关键业务。
  • 惰性队列:消息直接存入磁盘,减少内存使用,适用于大规模消息堆积的场景,避免内存压力。自3.12版本起成为默认队列类型,并受到官方推荐。

通过了解这些消息存储机制及其应用场景,开发者可以更好地利用RabbitMQ的功能,优化消息处理流程,提升系统性能和可靠性。

相关文章:

理解RabbitMQ中的消息存储机制:非持久化、持久化与惰性队列(Lazy Queue)

文章目录 1. 非持久化消息(Transient Messages)内存压力处理 2. 持久化消息(Persistent Messages)3. 惰性队列(Lazy Queue)官方推荐 总结 在RabbitMQ中,消息的存储和处理方式可以根据不同的需求…...

【机器学习】BP神经网络正向计算

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 BP神经网络正向计算1. 引言2. BP神经网络结构回顾3. 正向计算的基本原理4. 数学…...

谷粒商城实战笔记-108~109-elasticsearch删除与批量导入

一,108-全文检索-ElasticSearch-入门-put&post修改数据 第一种更新方式: POST customer/external/1/_update {"doc":{"name": "John Doew"} }第二种更新方式: POST customer/external/1 { "name&q…...

RabbitMQ:发送者的可靠性之使用消息确认回调

文章目录 配置RabbitMQ的ConfirmCallback使用ConfirmCallback发送消息实际使用中的注意事项总结 在开发消息驱动的系统时,消息的可靠传递至关重要。而RabbitMQ作为一个广泛使用的消息队列中间件,提供了多种消息确认机制,确保消息从生产者到交…...

HCIP学习 | OSPF---LSA限制、不规则区域、附录E、选路

目录 Days06(24.8.8)OSPF---LSA限制、不规则区域、附录E、选路 特殊区域 stub 区域, 末节区域 Totally stub :完全的末节区域 NSSA区域:(not so stub area) 非完全末节区域 完全的非完全的末节区域: …...

CVE-2017-15715~Apache解析漏洞【春秋云境靶场渗透】

Apache解析漏洞 漏洞原理 # Apache HTTPD 支持一个文件拥有多个后缀,并为不同后缀执行不同的指令。比如如下配置文件: AddType text/html .html AddLanguage zh-CN .cn# 其给 .html 后缀增加了 media-type ,值为 text/html ;给 …...

thinkphp 5.0.24生成模块

访问的形式生成模块: 1、需要在入口文件Public/index.php中加入以下代码: //生成Home模块,添加以下这句后,打开浏览器执行:http://www3.phptp5.com/public/index.php自动生成Home模块 \think\Build::module(Home); …...

值得注意!家里有带毛发动物就有浮毛?宠物空气净化器一键净化

上次跟朋友逛完街去她家,她家热情的哈基米开门就一个猛冲,我朋友接住就是一顿猛亲,亲猫一时爽,汗液粘着猫毛,粘得满手臂、满脸都是,看得鼻炎星人头皮发麻...好多养宠物的都说,梳毛根本不管用&am…...

Linux 代理(proxy)设置

有关网络代理的环境变量 环境变量说明可选的取值http_proxyhttp协议的网络连接使用该代理。ip:porthttp://ip:portsocks://ip:portsocks4://ip:portsocks5://ip:porthttps_proxyhttps协议的网络连接使用该代理。ftp_proxyftp协议使用该代理。all_proxy所有网络协议的网络连接都…...

操作系统真相还原:获取文件属性

14.15 获得文件属性 14.15.1 ls命令的幕后功臣 ls 命令中调用了大量的系统调用 stat64 和write ,其中stat64 用于获得文件的属性信息, write 用于把信息输出到屏幕,即标准输出。这里的 stat64 表示 64 位版本的 stat。 其函数原型是int sta…...

聚鼎装饰画:投资一家装饰画店铺要花费多少钱

在艺术的殿堂里,每一幅装饰画都是静默的诗篇,而开设一家装饰画店铺,便是将这份静谧与美好呈现给世界的开始。然而,背后的投资成本,却是一笔需要精打细算的账。 店铺的选址,犹如画家挑选画布,至关…...

编程的魅力、其重要性、学习方法以及未来趋势

在数字化时代,编程已不仅仅是程序员的专属技能,它逐渐渗透到我们生活的方方面面,成为连接现实与虚拟世界的桥梁。从日常使用的智能手机应用到探索宇宙奥秘的超级计算机,编程的力量无处不在。本文将深入探讨编程的魅力、其重要性、…...

ubuntu init set

1 cuda驱动 cuda use not open test 自己下载安装 以上操作后可能是核显卡,需要执行下列进入独立显卡,才能进行HDMI链接 sudo prime-select nvidia sudo prime-select intel prime-select query 该命令用于查看目前的显卡使用模式,可以看到…...

MySQL数据分析进阶(八)存储过程

※食用指南:文章内容为‘CodeWithMosh’SQL进阶教程系列学习笔记,笔记整理比较粗糙,主要目的自存为主,记录完整的学习过程。(图片超级多,慎看!) 【中字】SQL进阶教程 | 史上最易懂S…...

最深的根,

1498. 最深的根 题目 提交记录 讨论 题解 视频讲解 一个无环连通图可以被视作一个树。 树的高度取决于所选取的根节点。 现在,你要找到可以使得树的高度最大的根节点。 它被称为最深的根。 输入格式 第一行包含整数 NN,表示节点数量。 节点…...

【常见的设计模式】工厂模式

【设计模式专题之工厂方法模式】2.积木工厂   题目描述 小明家有两个工厂,一个用于生产圆形积木,一个用于生产方形积木,请你帮他设计一个积木工厂系统,记录积木生产的信息。   输入描述 输入的第一行是一个整数 N(1 …...

postgres收缩工具两种工具的使用对比

postgres收缩工具安装和使用 第一章 需要使用插件处理膨胀的原因 Postgresql通过数据多版本实现MVCC,现象是删除数据并不会真正删除数据,而是修改标识,更新是通过删除+插入的方式进行,所以在频繁更新的OLTP系统,会造成数据膨胀。 PG数据库本身有处理膨胀问题的vacuum工…...

仿真入门——CST软件如何设置分布式计算的共享储存

在 CST Studio Suite 的分布式计算中,常有用户因为某台机器的网络问题丢失某个数据。这里介绍一种方法,可以在使用分布式计算或 MPI 计算时设置共享存储。在这种情况下,不涉及文件传输,所有文件操作都在共享文件的媒介上完成。 数…...

【JVM基础17】——实践-说一下JVM调优工具

目录 1- 引言:2- ⭐核心:2-1 命令工具jpsjstackjmapjstat 2-2 可视化工具jconsoleVisualVM 3- 小结:3-1 说一下 JVM 调优的工具 1- 引言: 命令工具 jps——进程状态信息jstack——查看Java进程内线程的堆栈信息jmap——查看堆转…...

【QT】Qt中Websocket的使用

一、WebSocket的定义 WebSocket是一种在单个TCP连接上进行全双工通信的协议。WebSocket通信协议于2011年被IETF定为标准RFC 6455,并由RFC7936补充规范。WebSocket API也被W3C定为标准。 WebSocket使得客户端和服务器之间的数据交换变得更加简单,…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

【网络】每天掌握一个Linux命令 - iftop

在Linux系统中,iftop是网络管理的得力助手,能实时监控网络流量、连接情况等,帮助排查网络异常。接下来从多方面详细介绍它。 目录 【网络】每天掌握一个Linux命令 - iftop工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

ffmpeg(四):滤镜命令

FFmpeg 的滤镜命令是用于音视频处理中的强大工具&#xff0c;可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下&#xff1a; ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜&#xff1a; ffmpeg…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...