【消息队列RocketMQ】四、RocketMQ 存储机制与性能优化
一、RocketMQ 存储机制详解
1.1 存储文件结构
RocketMQ 的存储文件主要分布在store目录下,该目录是在broker.conf配置文件中通过storePathRootDir参数指定的,默认路径为${user.home}/store 。主要包含以下几种关键文件类型:
1.1.1 CommitLog 文件:所有主题的消息都顺序存储在 CommitLog 文件中,它是 RocketMQ 消息存储的核心。每个 CommitLog 文件默认大小为 1G,文件名以该文件创建时第一条消息的偏移量命名,如00000000000000000000。消息在 CommitLog 中以固定格式存储,包含消息长度、CRC 校验码、消息体等信息。这种顺序存储方式极大地提高了磁盘的写入性能。
1.1.2 ConsumeQueue 文件:ConsumeQueue 是消息消费队列的存储文件,每个 Topic 的每个 Queue 都对应一个 ConsumeQueue 文件。它起到索引的作用,存储了消息在 CommitLog 中的物理偏移量、消息大小、Tag 的哈希值等信息。通过 ConsumeQueue,Consumer 可以快速定位到消息在 CommitLog 中的位置,从而实现高效的消息拉取。ConsumeQueue 文件默认大小约为 600W 条消息,文件名同样以偏移量命名。
1.1.3 IndexFile 文件:IndexFile 用于实现消息的快速检索,主要为了满足根据消息 Key 或时间范围查询消息的需求。它存储了消息的 Key、CommitLog 偏移量、时间戳等信息,并构建了 Hash 索引。每个 IndexFile 文件固定大小为 400M,文件名以创建时的时间戳命名。
1.1.4 Checkpoint 文件:Checkpoint 文件记录了 CommitLog、ConsumeQueue 和 IndexFile 的最后更新时间戳,用于 Broker 重启时进行数据恢复,确保数据的一致性和完整性。
1.1.5 Abort 文件:Abort 文件是一个标识文件,当 Broker 正常关闭时,该文件会被删除;如果 Broker 异常退出,Abort 文件会保留,用于指示 Broker 下次启动时需要进行数据恢复操作。
1.2 消息写入原理
1.2.1 Producer 发送消息:Producer 将消息发送到 Broker,Broker 接收到消息后,首先会对消息进行校验,如检查消息大小、Topic 是否存在等。
1.2.2 写入 CommitLog:校验通过后,消息会被顺序写入 CommitLog 文件。在写入过程中,会为消息分配唯一的偏移量,同时计算 CRC 校验码,确保消息的完整性。由于 CommitLog 采用顺序写入,充分利用了磁盘的顺序读写特性,大大提高了写入效率。
1.2.3 更新 ConsumeQueue:消息写入 CommitLog 成功后,Broker 会根据消息所属的 Topic 和 Queue,更新对应的 ConsumeQueue 文件。在 ConsumeQueue 中,记录该消息在 CommitLog 中的偏移量等信息,为 Consumer 拉取消息提供索引。
1.2.4 更新 IndexFile(可选):如果消息设置了 Key,Broker 会将消息的 Key、CommitLog 偏移量等信息写入 IndexFile,构建 Hash 索引,以便后续根据 Key 进行快速查询。
1.3 消息读取原理
1.3.1 Consumer 请求消息:Consumer 向 Broker 发送拉取消息的请求,请求中包含 Topic、Queue 等信息。
1.3.2 查询 ConsumeQueue:Broker 接收到请求后,根据 Topic 和 Queue 找到对应的 ConsumeQueue 文件,从 ConsumeQueue 中读取消息在 CommitLog 中的偏移量和消息大小等信息。
1.3.3 读取 CommitLog:根据 ConsumeQueue 中获取的偏移量,从 CommitLog 文件中读取完整的消息数据。在读取过程中,会验证 CRC 校验码,确保消息的正确性。
1.3.4 返回消息给 Consumer:Broker 将读取到的消息返回给 Consumer,Consumer 接收到消息后进行业务处理。
二、CentOS 7 下 RocketMQ 存储相关配置
2.1 配置文件修改
在 CentOS 7 上,RocketMQ 的主要配置文件为broker.conf,位于 RocketMQ 安装目录的conf文件夹下。以下是一些与存储相关的重要配置参数及其修改说明:
1、存储路径配置:
storePathRootDir=/home/rocketmq/store
storePathCommitLog=/home/rocketmq/store/commitlog
storePathConsumeQueue=/home/rocketmq/store/consumequeue
storePathIndex=/home/rocketmq/store/index
storeCheckpoint=/home/rocketmq/store/checkpoint
abortFile=/home/rocketmq/store/abort
上述配置分别指定了 RocketMQ 各类存储文件的根目录、CommitLog 文件目录、ConsumeQueue 文件目录、IndexFile 文件目录、Checkpoint 文件路径以及 Abort 文件路径。可根据实际磁盘空间和业务需求调整这些路径,例如将存储文件分散到不同的磁盘分区,以提高 I/O 性能。
2、刷盘机制配置:
flushDiskType=ASYNC_FLUSH
# 或
# flushDiskType=SYNC_FLUSH
flushDiskType参数用于设置刷盘方式,有ASYNC_FLUSH(异步刷盘)和SYNC_FLUSH(同步刷盘)两种模式。异步刷盘时,消息写入内存后立即返回成功响应,由后台线程定期将内存中的数据刷入磁盘,这种方式写入性能高,但存在数据丢失风险;同步刷盘则是在消息写入磁盘后才返回成功响应,保证了数据的可靠性,但会降低写入性能。
3、文件大小配置:
mapedFileSizeCommitLog=1073741824
mapedFileSizeConsumeQueue=30000000
mapedFileSizeCommitLog用于设置 CommitLog 文件的大小,默认值为 1G(1073741824 字节);mapedFileSizeConsumeQueue用于设置 ConsumeQueue 文件的大小,默认约为 30M(30000000 字节)。可根据实际业务量和磁盘空间调整这些参数,例如业务消息量较大时,适当增大 CommitLog 文件大小,减少文件切换频率。
2.2 命令操作
1、查看存储文件状态:可通过查看store目录下的文件及相关日志,了解存储文件的状态。例如,查看 CommitLog 文件的内容(不建议直接查看二进制文件,可通过日志辅助分析):
ls -l /home/rocketmq/store/commitlog
2、重启 Broker 使配置生效:修改broker.conf配置文件后,需要重启 Broker 才能使配置生效。先停止 Broker:
sh mqshutdown broker
再重新启动 Broker:
nohup sh mqbroker -c conf/broker.conf &
三、RocketMQ 性能优化策略
3.1 刷盘机制优化
1、根据业务场景选择刷盘方式:对于可靠性要求极高的业务,如金融交易,应选择SYNC_FLUSH同步刷盘方式,确保消息不丢失;对于对性能要求较高,可容忍一定数据丢失风险的业务,如日志记录,可采用ASYNC_FLUSH异步刷盘方式,提升写入性能。
2、调整异步刷盘参数:如果采用异步刷盘,可通过调整flushCommitLogLeastPages和flushCommitLogThoroughInterval参数优化刷盘性能。flushCommitLogLeastPages表示每次异步刷盘时,内存中至少积累的页数(默认为 4 页);flushCommitLogThoroughInterval表示强制刷盘的时间间隔(单位为毫秒,默认值为 1000 * 60 * 5,即 5 分钟)。可根据实际业务量,适当减小flushCommitLogLeastPages,缩短flushCommitLogThoroughInterval,以提高数据刷盘的及时性。
3.2 文件存储优化
1、合理设置文件大小:根据业务消息量和磁盘空间,合理调整 CommitLog 和 ConsumeQueue 文件的大小。避免文件过大导致查询效率降低,或文件过小频繁切换文件带来的性能开销。例如,对于消息量较小且消息生命周期较短的业务,可适当减小 ConsumeQueue 文件大小。
2、分散存储路径:将 CommitLog、ConsumeQueue、IndexFile 等存储文件分散到不同的磁盘分区或物理磁盘上,减少 I/O 竞争,提高读写性能。在broker.conf中修改存储路径配置实现。
3.3 内存映射优化
RocketMQ 采用内存映射(mmap)技术,将文件映射到内存中,减少数据在用户态和内核态之间的拷贝,提高读写效率。可通过调整系统参数vm.max_map_count来优化内存映射性能。在 CentOS 7 上,使用以下命令临时调整该参数:
sysctl -w vm.max_map_count=655300
如需永久生效,可修改/etc/sysctl.conf文件,添加或修改:
vm.max_map_count=655300
然后执行sysctl -p使配置生效。
3.4 其他优化措施
1、负载均衡:合理配置 Producer 和 Consumer 的负载均衡策略,避免单个 Broker 负载过高。例如,Producer 可采用轮询等方式将消息发送到不同的 Broker,Consumer 可根据消费能力动态分配消息队列。
2、定期清理过期数据:对于不再需要的消息,可通过设置消息的过期时间(在发送消息时设置maxTimeToLive参数),让 Broker 自动清理过期数据,减少存储压力。
相关文章:
【消息队列RocketMQ】四、RocketMQ 存储机制与性能优化
一、RocketMQ 存储机制详解 1.1 存储文件结构 RocketMQ 的存储文件主要分布在store目录下,该目录是在broker.conf配置文件中通过storePathRootDir参数指定的,默认路径为${user.home}/store 。主要包含以下几种关键文件类型: 1.1.1 Comm…...
结合地理数据处理
CSV 文件不仅可以存储表格数据,还可以与地理空间数据结合,实现更强大的地理处理功能。例如,你可以将 CSV 文件中的坐标数据转换为点要素类,然后进行空间分析。 示例:将 CSV 文件中的坐标数据转换为点要素类 假设我们有…...
店匠科技摘得 36 氪“2025 AI Partner 创新大奖”
全场景 AI 方案驱动跨境电商数智化跃迁 4 月 18 日,36 氪 2025 AI Partner 大会于上海盛大开幕。大会紧扣“Super App 来了”主题,全力探寻 AI 时代的全新变量,探索 AI 领域下一个超级应用的无限可能性。在此次大会上,跨境电商独立站 SaaS 平台店匠科技(Shoplazza)凭借“店匠跨…...
Joint communication and state sensing under logarithmic loss
摘要——我们研究一种基本的联合通信与感知设置,其中发射机希望向接收机传输一条消息,并同时通过广义反馈估计其信道状态。我们假设感知目标是获得状态的软估计(即概率分布),而非通常假设的点估计;并且我们…...
测试基础笔记第十天
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、查询语句1.基本查询2.条件查询3.模糊查询4.范围查询5.判断空 二、其他复杂查询1.排序2.聚合函数3.分组4.分页查询 一、查询语句 1.基本查询 – 需求1: 准备商…...
Geek强大的电脑卸载软件工具,免费下载
一款强大的卸载电脑软件工具,无需安装 免费下载...
Linux:41线程控制lesson29
1.线程的优点: • 创建⼀个新线程的代价要⽐创建⼀个新进程⼩得多 创建好线程只要调度就好了 • 与进程之间的切换相⽐,线程之间的切换需要操作系统做的⼯作要少很多 为什么? ◦ 最主要的区别是线程的切换虚拟内存空间依然是相同的&#x…...
基于Flask与Ngrok实现Pycharm本地项目公网访问:从零部署
目录 概要 1. 环境与前置条件 2. 安装与配置 Flask 2.1 创建虚拟环境 2.2 安装 Flask 3. 安装与配置 Ngrok 3.1 下载 Ngrok 3.2 注册并获取 Authtoken 4. 在 PyCharm 中创建 Flask 项目 5. 运行本地 Flask 服务 6. 启动 Ngrok 隧道并获取公网地址 7. 完整示例代码汇…...
Ai晚报20250423
Kortix 发布全球首个开源通用型 AI Agent——Suna,能像人类一样学习、推理和适应,通过自然对话帮助用户完成多种现实任务,支持浏览器自动化、文件管理等 20 个用户场景。腾讯混元大模型 AI 阅读助手“企鹅读伴”正式上线,为中小学…...
密码学货币混币器详解及python实现
目录 一、前言二、混币器概述2.1 混币器的工作原理2.2 关键特性三、数据生成与预处理四、系统架构与流程五、核心数学公式六、异步任务调度与 GPU 加速七、PyQt6 GUI 设计八、完整代码实现九、自查测试与总结十、展望摘要 本博客聚焦 “密码学货币混币器实现”,以 Python + P…...
HTMLCSS实现网页轮播图
网页中轮播图区域的实现与解析 在现代网页设计中,轮播图是一种常见且实用的元素,能够在有限的空间内展示多个内容,吸引用户的注意力。下面将对上述代码中轮播图区域的实现方式进行详细介绍。 一、HTML 结构 <div class"carousel-c…...
如何确定置信水平的最佳大小
在统计学中,置信水平的选择并不是一成不变的,而是根据具体的研究目的、样本量、数据类型以及行业标准等因素来确定的。然而,在大多数情况下,95%的置信水平是最常用的。 选择95%置信水平的原因 平衡可靠性与精确性: •…...
Java基础第21天-正则表达式
正则表达式是对字符串执行模式匹配的技术 如果想灵活的运用正则表达式,必须了解其中各种元字符的功能,元字符从功能上大致分为: 限定符选择匹配符分组组合和反向引用符特殊字符字符匹配符定位符 转义号\\:在我们使用正则表达式去检索某些特…...
Maven 项目中引入本地 JAR 包
在日常开发过程中,我们有时会遇到一些未上传到 Maven 中央仓库或公司私有仓库的 JAR 包,比如第三方提供的 SDK 或自己编译的库。这时候,我们就需要将这些 JAR 包手动引入到 Maven 项目中。本文将介绍两种常见方式:将 JAR 安装到本…...
CSGO 盲盒开箱系统技术实现深度解析
一、系统架构设计 (一)前后端分离架构 采用前后端分离模式,后端专注业务逻辑处理与数据管理,前端负责用户交互界面呈现。后端通过 RESTful API 与前端进行数据交互,这种架构能有效提高开发效率,便于团队分…...
JS通过GetCapabilities获取wms服务元数据信息并在SuperMap iClient3D for WebGL进行叠加显示
获取wms服务元数据信息并在三维webgl客户端进行叠加显示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…...
7N60-ASEMI无人机专用功率器件7N60
编辑:LL 7N60-ASEMI无人机专用功率器件7N60 型号:7N60 品牌:ASEMI 封装:TO-220F 最大漏源电流:7A 漏源击穿电压:600V 批号:最新 RDS(ON)Max:1.20Ω …...
Redis日常学习(一)
我的Redis学习笔记:从命令行到性能调优 Redis Redis(Remote Dictionary Server)本质上是一个基于内存的键值存储系统. 安装配置Redis的过程非常简单: # Ubuntu/Debian安装Redis sudo apt-get update sudo apt-get install red…...
Pytorch图像数据转为Tensor张量
PyTorch的所有模型(nn.Module)都只接受Tensor格式的输入,所以我们在使用图像数据集时,必须将图像转换为Tensor格式。PyTorch提供了torchvision.transforms模块来处理图像数据集。torchvision.transforms模块提供了一些常用的图像预…...
Java 加密与解密:从算法到应用的全面解析
Java 加密与解密:从算法到应用的全面解析 一、加密与解密技术概述 在当今数字化时代,数据安全至关重要。Java 加密与解密技术作为保障数据安全的关键手段,被广泛应用于各个领域。 加密是将明文数据通过特定算法转换为密文,使得…...
Java基础系列-HashMap源码解析2-AVL树
文章目录 AVL树左旋右旋左旋右旋的4种情况LL 型RR 型LR 型RL 型 实际插入时怎么判断是那种类型?插入时注意事项删除节点 AVL树 为避免BST树退化成链表的极端情况, AVL 树应运而生。 平衡因子取值(-1,0,1)…...
蓝桥杯 19. 最大比例
最大比例 原题目链接 题目描述 X 星球的某个大奖赛设了 M 级奖励。每个级别的奖金是一个正整数。 并且,相邻两个级别间的比例是一个固定值,也就是说:所有级别的奖金构成一个等比数列。 例如: 奖金数列为 16, 24, 36, 54&…...
前端加密介绍与实战
前端数据加密 文章目录 前端数据加密前端数据加密介绍为什么需要前端数据加密?前端数据加密的常见方式前端数据加密的实现场景:加密用户密码并发送到后端步骤 1:安装加密库步骤 2:实现加密逻辑步骤 3:后端解密 实战总结…...
Zookeeper是什么?基于zookeeper实现分布式锁
zookeeper听的很多,但实际在应用开发中用的不错,主要是作为中间件配合使用的,例如:Kafka。 了解zk首先需要知道它的数据结构,可以想象为树、文件夹目录。每个节点有基本的信息,例如:创建时间、…...
Kafka 主题设计与数据接入机制
一、前言:万物皆流,Kafka 是入口 在构建实时数仓时,Kafka 既是 数据流动的起点,也是后续流处理系统(如 Flink)赖以为生的数据源。 但“消息进来了” ≠ “你就能处理好了”——不合理的 Topic 设计、接入方…...
gem5-gpu教程05 内存建模
memory-modeling|Details on how memory is modeled in gem5-gpu gem5-gpu’s Memory Simulation gem5-gpu在很大程度上避开了GPGPU-Sim的单独功能模拟,而是使用了gem5的执行中执行模型。因此,当执行存储/加载时,内存会被更新/读取。没有单独的功能路径。(顺便说一句,这…...
MySQL的日志--Redo Log【学习笔记】
MySQL的日志--Redo Log 知识来源: 《MySQL是怎样运行的》--- 小孩子4919 MySQL的事务四大特性之一就是持久性(Durability)。但是底层是如何实现的呢?这就需要我们的Redo Log(重做日志)闪亮登场了。它记录着…...
【AI应用】免费代码仓构建定制版本的ComfyUI应用镜像
免费代码仓构建定制版本的ComfyUI应用镜像 1 创建代码仓1.1 注册登陆1.2 创建代码仓1.5 安装中文语言包1.4 拉取ComfyUI官方代码2 配置参数和预装插件2.1 保留插件和模型的版本控制2.2 克隆插件到代码仓2.2.1 下载插件2.2.2 把插件设置本仓库的子模块管理3 定制Docker镜像3.1 创…...
MineWorld,微软研究院开源的实时交互式世界模型
MineWorld是什么 MineWorld是微软研究院开发并开源的一个基于《我的世界》(Minecraft)的实时互动世界模型。该模型采用了视觉-动作自回归Transformer架构,将游戏场景和玩家动作转化为离散的token ID,并通过下一个token的预测进行…...
被裁20240927 --- 视觉目标跟踪算法
永远都像初次见你那样使我心荡漾 参考文献目前主流的视觉目标跟踪算法一、传统跟踪算法1. 卡尔曼滤波(Kalman Filter)2. 相关滤波(Correlation Filter,如KCF、MOSSE)3. 均值漂移(MeanShift/CamShift&#x…...
