【消息队列RocketMQ】四、RocketMQ 存储机制与性能优化

news2025/4/24 19:31:11

一、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 自动清理过期数据,减少存储压力。

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

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

相关文章

店匠科技摘得 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

摘要——我们研究一种基本的联合通信与感知设置,其中发射机希望向接收机传输一条消息,并同时通过广义反馈估计其信道状态。我们假设感知目标是获得状态的软估计(即概率分布),而非通常假设的点估计;并且我们…

Linux:41线程控制lesson29

1.线程的优点: • 创建⼀个新线程的代价要⽐创建⼀个新进程⼩得多 创建好线程只要调度就好了 • 与进程之间的切换相⽐,线程之间的切换需要操作系统做的⼯作要少很多 为什么? ◦ 最主要的区别是线程的切换虚拟内存空间依然是相同的&#x…

HTMLCSS实现网页轮播图

网页中轮播图区域的实现与解析 在现代网页设计中&#xff0c;轮播图是一种常见且实用的元素&#xff0c;能够在有限的空间内展示多个内容&#xff0c;吸引用户的注意力。下面将对上述代码中轮播图区域的实现方式进行详细介绍。 一、HTML 结构 <div class"carousel-c…

Java基础第21天-正则表达式

正则表达式是对字符串执行模式匹配的技术 如果想灵活的运用正则表达式&#xff0c;必须了解其中各种元字符的功能&#xff0c;元字符从功能上大致分为&#xff1a; 限定符选择匹配符分组组合和反向引用符特殊字符字符匹配符定位符 转义号\\:在我们使用正则表达式去检索某些特…

CSGO 盲盒开箱系统技术实现深度解析

一、系统架构设计 &#xff08;一&#xff09;前后端分离架构 采用前后端分离模式&#xff0c;后端专注业务逻辑处理与数据管理&#xff0c;前端负责用户交互界面呈现。后端通过 RESTful API 与前端进行数据交互&#xff0c;这种架构能有效提高开发效率&#xff0c;便于团队分…

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

编辑&#xff1a;LL 7N60-ASEMI无人机专用功率器件7N60 型号&#xff1a;7N60 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大漏源电流&#xff1a;7A 漏源击穿电压&#xff1a;600V 批号&#xff1a;最新 RDS&#xff08;ON&#xff09;Max&#xff1a;1.20Ω …

Pytorch图像数据转为Tensor张量

PyTorch的所有模型&#xff08;nn.Module&#xff09;都只接受Tensor格式的输入&#xff0c;所以我们在使用图像数据集时&#xff0c;必须将图像转换为Tensor格式。PyTorch提供了torchvision.transforms模块来处理图像数据集。torchvision.transforms模块提供了一些常用的图像预…

Java 加密与解密:从算法到应用的全面解析

Java 加密与解密&#xff1a;从算法到应用的全面解析 一、加密与解密技术概述 在当今数字化时代&#xff0c;数据安全至关重要。Java 加密与解密技术作为保障数据安全的关键手段&#xff0c;被广泛应用于各个领域。 加密是将明文数据通过特定算法转换为密文&#xff0c;使得…

Java基础系列-HashMap源码解析2-AVL树

文章目录 AVL树左旋右旋左旋右旋的4种情况LL 型RR 型LR 型RL 型 实际插入时怎么判断是那种类型&#xff1f;插入时注意事项删除节点 AVL树 为避免BST树退化成链表的极端情况&#xff0c; AVL 树应运而生。 平衡因子取值&#xff08;-1&#xff0c;0&#xff0c;1&#xff09;…

MySQL的日志--Redo Log【学习笔记】

MySQL的日志--Redo Log 知识来源&#xff1a; 《MySQL是怎样运行的》--- 小孩子4919 MySQL的事务四大特性之一就是持久性&#xff08;Durability&#xff09;。但是底层是如何实现的呢&#xff1f;这就需要我们的Redo Log&#xff08;重做日志&#xff09;闪亮登场了。它记录着…

【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 创…

​​Agentic AI——当AI学会主动思考与决策,世界将如何被重塑?

一、引言&#xff1a;2025&#xff0c;Agentic AI的元年 “如果ChatGPT是AI的‘聊天时代’&#xff0c;那么2025年将开启AI的‘行动时代’。”——Global X Insights[1] 随着Agentic AI&#xff08;自主决策型人工智能&#xff09;的崛起&#xff0c;AI系统正从被动应答的“工具…

Ollama API 应用指南

1. 基础信息 默认地址: http://localhost:11434/api数据格式: application/json支持方法: POST&#xff08;主要&#xff09;、GET&#xff08;部分接口&#xff09; 2. 模型管理 API (1) 列出本地模型 端点: GET /api/tags功能: 获取已下载的模型列表。示例:curl http://lo…

PNG透明免抠设计素材大全26000+

在当今的数字设计领域&#xff0c;寻找高质量且易于使用的素材是每个设计师的日常需求。今天&#xff0c;我们将为大家介绍一个超全面的PNG透明免抠设计素材大全&#xff0c;涵盖多种风格、主题和应用场景&#xff0c;无论是平面设计、网页设计还是多媒体制作&#xff0c;都能轻…

4.多表查询

SQL 多表查询&#xff1a;数据整合与分析的强大工具 文章目录 SQL 多表查询&#xff1a;数据整合与分析的强大工具一、 多表查询概述1.1 为什么需要多表查询1.2 多表查询的基本原理 二、 多表查询关系2.1 一对一关系&#xff08;One-to-One&#xff09;示例&#xff1a; 2.2 一…

美团2024年春招第一场笔试 C++

目录 1&#xff0c;小美的平衡矩阵 2&#xff0c;小美的数组询问 3&#xff0c;小美的MT 4&#xff0c;小美的朋友关系 1&#xff0c;小美的平衡矩阵 【题目描述】 给定一个n*n的矩阵&#xff0c;该矩阵只包含数字0和1。对于 每个i(1<i<n)&#xff0c;求在该矩阵中&am…

XHTMLConverter把docx转换html报java.lang.NullPointerException异常

一.报错 1.报错信息 org.apache.poi.xwpf.converter.core.XWPFConverterException: java.lang.NullPointerExceptionat org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.convert(XHTMLConverter.java:77)at org.apache.poi.xwpf.converter.xhtml.XHTMLConverter.doConve…

OpenCV 图形API(52)颜色空间转换-----将 NV12 格式的图像数据转换为 RGB 格式的图像

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 NV12 (YUV420p) 色彩空间转换为 RGB。该函数将输入图像从 NV12 色彩空间转换到 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图…