RabbitMQ消息持久化与Lazy模式对比分析

RabbitMQ消息持久化与Lazy模式对比分析

在RabbitMQ中,消息持久化Lazy模式是两种不同的机制,分别针对消息可靠性、存储优化等不同维度设计。以下从六个层面进行深度对比:


一、核心目标与作用对象差异
维度消息持久化(delivery_mode=2Lazy模式(x-queue-mode=lazy
主要目标保证消息内容在服务重启后不丢失优化消息存储方式,减少内存压力
作用对象单条消息的存储介质选择整个队列的消息存储策略
触发条件生产者发送消息时显式设置队列声明时配置或通过Policy全局策略
数据可靠性依赖队列持久化协同工作仅影响运行时存储位置,不决定数据存续性

二、存储机制对比
机制特性消息持久化Lazy模式
存储位置持久化消息强制落盘所有消息直接写入磁盘(无论是否持久化)
触发条件需要显式设置delivery_mode=2队列声明时参数定义或Policy覆盖默认行为
运行时行为消息在内存中处理,按需刷盘消息直接写入磁盘,消费时加载到内存
重启后表现需队列持久化+消息持久化双重保障队列元数据存在则消息保留(与持久化无关)

关键区别

  • 消息持久化是消息级别的属性,决定消息是否在服务异常时保留内容
  • Lazy模式是队列级别的存储策略,决定运行时消息的物理存储位置

三、数据可靠性组合条件

要实现消息不丢失,需满足以下条件:

  1. 队列持久化durable=true)→ 保证队列元数据存在
  2. 消息持久化delivery_mode=2)→ 保证消息内容落盘
  3. Lazy模式 → 运行时减少内存占用(非必须但推荐)

典型场景验证

配置组合服务重启后结果运行时内存占用
队列持久化 + 消息持久化消息保留
队列持久化 + Lazy模式消息保留(即使未设置消息持久化)
队列非持久化 + Lazy模式队列和消息均丢失

注意:在RabbitMQ 3.12+版本中,Lazy模式默认启用,但若队列未持久化,重启后仍会丢失所有数据


四、性能影响对比
性能指标消息持久化Lazy模式
内存占用高(消息在内存处理)极低(仅元数据在内存)
磁盘I/O中等(按需刷盘)高(所有消息直接写磁盘)
吞吐量较高(依赖内存速度)较低(受磁盘速度限制)
消费延迟低(消息在内存处理)中(需从磁盘加载到内存)

实验数据参考

  • Lazy模式+消息持久化:每秒处理约2万条消息,内存占用稳定在50MB以下
  • 默认模式+消息持久化:每秒处理5万条消息,内存峰值可达2GB

五、典型应用场景
场景类型消息持久化适用性Lazy模式适用性
金融交易✔️(必须保证消息零丢失)✔️(减少内存压力)
日志收集❌(允许部分丢失)✔️(处理海量数据)
实时监控❌(低延迟优先)❌(需内存快速处理)
离线批处理✔️(数据完整性要求高)✔️(支持长时间堆积)

最佳实践

  • 高可靠场景队列持久化 + 消息持久化 + Lazy模式
  • 高吞吐场景队列非持久化 + 默认模式(临时数据处理)
  • 海量堆积场景队列持久化 + Lazy模式(允许消息非持久化)

六、配置代码示例
1. 消息持久化配置(Java Spring AMQP)
// 发送持久化消息
rabbitTemplate.convertAndSend("exchange", "routingKey", message, msg -> {msg.getMessageProperties().setDeliveryMode(MessageDeliveryMode.PERSISTENT); // delivery_mode=2return msg;
});
2. Lazy模式声明(队列级别)
@Bean
public Queue lazyQueue() {return QueueBuilder.durable("lazy.queue").lazy() // 启用Lazy模式.build();
}
3. Policy全局策略(RabbitMQ命令行)
# 所有以"lazy_"开头的队列自动启用Lazy模式
rabbitmqctl set_policy Lazy_Policy "^lazy_" '{"queue-mode":"lazy"}' --apply-to queues

结论

消息持久化与Lazy模式本质解决不同维度问题:

  • 消息持久化是数据可靠性的基石,需与队列持久化配合使用
  • Lazy模式是存储优化手段,适用于内存敏感场景
    在RabbitMQ 3.12+版本中,建议所有持久化队列默认启用Lazy模式,并配合delivery_mode=2实现高可靠低内存占用的消息处理。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/72206.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/72206.shtml

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

相关文章

Search-R1 、 R1-Searcher 和 Search-O1

原文链接:https://i68.ltd/notes/posts/20250307-search-r1/ Search-R1 DeepSeek团队开发的SEARCH-R1模型通过强化学习,让AI学会了自主搜索信息并将其与推理过程无缝结合,性能提升高达26%高效、可扩展的RL训练框架,用于推理和搜索引擎调用&…

linux 命令 tail

tail 是 Linux 中用于查看文件末尾内容的命令&#xff0c;常用于日志监控和大文件快速浏览。以下是其核心用法及常见选项&#xff1a; 基本语法 tail [选项] 文件名 常用选项 显示末尾行数 -n <行数> 或 --lines<行数> 指定显示文件的最后若干行&#xff08;…

某乎x-zse-96加密算法分析与还原

文章目录 1. 写在前面2. 接口分析3. 加密分析4. 算法实现 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致…

Java常用算法

一、排序算法 排序算法是计算机科学中最基础的算法之一&#xff0c;用于将一组数据按照特定顺序排列。 1.1 冒泡排序&#xff08;Bubble Sort&#xff09; 通过重复遍历列表&#xff0c;比较相邻元素并交换位置&#xff0c;直到列表有序。时间复杂度&#xff1a;O(n)。 pub…

ubuntu 24 安装 python3.x 教程

目录 注意事项 一、安装不同 Python 版本 1. 安装依赖 2. 下载 Python 源码 3. 解压并编译安装 二、管理多个 Python 版本 1. 查看已安装的 Python 版本 2. 配置环境变量 3. 使用 update-alternatives​ 管理 Python 版本 三、使用虚拟环境为项目指定特定 Python 版本…

【后端】【django】Django 自带的用户系统与 RBAC 机制

Django 自带的用户系统与 RBAC 机制 Django 自带的用户系统&#xff08;django.contrib.auth&#xff09;提供了 身份验证&#xff08;Authentication&#xff09; 和 权限管理&#xff08;Authorization&#xff09;&#xff0c;能够快速实现 用户管理、权限控制、管理员后台…

怎样使用Modbus转Profinet网关连接USB转485模拟从站配置案例

怎样使用Modbus转Profinet网关连接USB转485模拟从站配置案例 Modbus转profinet网关可以将Modbus协议转化为profinet协议&#xff0c;以实现设备之间的数据交互。在实际使用过程中&#xff0c;我们需要使用Modbus协议进行设备通讯&#xff0c;而profinet协议则是用于工业自动化…

5.编译链接和宏**

1. 宏&#xff08;考察很多&#xff09;-要求轻松实现宏&#xff0c;很容易出错 #define 机制包括了一个规定&#xff0c;允许把参数替换到文本中&#xff0c;这种实现通常称为宏或定义宏。 下面是宏的声明方式&#xff1a; #define name(参数列表) 内容 参数列表的左括号必…

如何搭建一个适配微信小程序,h5,app的uni-app项目

在vscode搭建 uni-app 项目&#xff08;Vue 3 Vite Pinia uView Plus&#xff09; 一、环境准备 1. 安装 Node.js 确保已安装 Node.js&#xff08;需≥14版本&#xff09;&#xff0c;可通过以下命令检查版本&#xff1a; node -v2. 安装 VSCode 从 VSCode 官网 下载并…

Kotlin apply 方法的用法和使用场景

Kotlin apply 方法的用法和使用场景 1. 方法简介 apply 是 Kotlin 标准库中的一个扩展函数&#xff0c;用于对对象执行一系列操作&#xff0c;并返回该对象本身。它的语法如下&#xff1a; inline fun <T> T.apply(block: T.() -> Unit): T参数&#xff1a;block 是…

一文解读python高阶功能:匿名函数到魔法方法(__call__)

文章目录 一、python中匿名方法的使用使用示例注意事项总结 二、匿名函数和魔法方法的结合示例&#xff1a;结合 lambda 和 __call__解释更复杂的示例 总结 一、python中匿名方法的使用 在 Python 中&#xff0c;匿名方法是通过 lambda 关键字定义的&#xff0c;通常称为 lamb…

云服务器新手配置内网穿透服务(frp)

首先你得有一个公网服务器&#xff0c;有了它你就可以借助它&#xff0c;将自己电脑进行配置内网穿透&#xff0c;让自己内网电脑也可以异地轻松访问。网上教程较多&#xff0c;特此记录我自己的配置&#xff0c;避免迷路&#xff0c;我这里只记录我自己云服务小白&#xff0c;…

基于STM32的火灾报警设备(阿里云平台)

目录 前言&#xff1a; 一、项目介绍和演示视频 二、硬件需求准备 三、硬件框图 1. 原理图 2. PCB 四、CubeMX配置 五、代码框架 前言&#xff1a; 源代码下载链接&#xff1a; https://download.csdn.net/download/m0_74712453/90474701 需要实物的可以私信博主或者…

学习笔记之车票搜索为什么用Redis而不是ES?

在文章正式开始前&#xff0c;大家打开 12306.cn 搜索一趟列车&#xff0c;根据搜索条件判断&#xff0c;数据搜索技术使用 ElasticSearch 或者其它搜索技术是否合适&#xff1f; 这里我先把答案说下&#xff0c;12306 车票搜索用的是 Redis &#xff0c;而不是大家常用的 Ela…

揭秘AI:机器学习与深度学习的奥秘

文章目录 机器学习与深度学习1. 什么是人工智能&#xff1f;2. 机器学习、深度学习和人工智能又是什么关系&#xff1f;3. 人工智能解决了什么问题&#xff1f;为什么需要人工智能&#xff1f;4. 机器学习、深度学习常用术语1&#xff09;模型2&#xff09;数据集3&#xff09;…

【具体场景实践】使用存储过程查数据全流程+自动调度

文章目录 场景设计场景描述:公司员工管理系统需求1. 创建数据库和表2. 插入测试数据3. 复杂存储过程4. 调用存储过程5. 结果示例6. 细节优化存储过程总结7. 自动定期执行存储过程7.1 启用 MySQL 事件调度器7.2 创建定时任务(每天凌晨 2 点自动执行)7.3 查看和管理事件1️⃣ …

【ubuntu】——wsl中使用windows中的adb

一、引言 在 Windows Subsystem for Linux&#xff08;WSL&#xff09;环境下工作时&#xff0c;有时需要使用 Android Debug Bridge&#xff08;ADB&#xff09;工具与 Android 设备进行交互。通过特定设置&#xff0c;能够在 WSL 中便捷地调用 Windows 系统中已安装的 ADB&a…

Centos离线安装gcc

文章目录 Centos离线安装gcc1. gcc是什么&#xff1f;2. gcc下载地址3. gcc的安装4. 安装结果验证 Centos离线安装gcc 1. gcc是什么&#xff1f; GCC&#xff08;GNU Compiler Collection&#xff09;是 GNU 项目下的开源编译器套件&#xff0c;主要用于将 C、C 等编程语言的源…

JAVA中的多态性以及它在实际编程中的作用

JAVA中的多态性以及它在实际编程中的作用&#xff1f; 在Java中&#xff0c;多态性是指一个对象可以具有多种形态。它主要体现在两个方面&#xff1a;编译时多态和运行时多态。 1.编译时多态 编译时多态通过方法重载&#xff08;Overloading&#xff09;来实现。方法重载是指…

NetLink内核套接字案例分析

一、基础知识 Netlink 是 Linux 系统中一种内核与用户空间通信的高效机制&#xff0c;而 Netlink 消息是这种通信的核心载体。它允许用户态程序&#xff08;如网络配置工具、监控工具&#xff09;与内核子系统&#xff08;如网络协议栈、设备驱动&#xff09;交换数据&#xff…