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

RocketMQ消息是如何存储的?

大家好,我是锋哥。今天分享关于【RocketMQ消息是如何存储的?】面试题。希望对大家有帮助;

RocketMQ消息是如何存储的?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

RocketMQ 使用了一个高性能、分布式的消息存储架构来处理消息的存储和持久化。消息的存储设计上考虑了 高吞吐量高可用性可靠性,以及对 消息的顺序性分区持久化的支持。以下是 RocketMQ 消息存储的核心概念和实现机制:

1. 存储的基本概念

RocketMQ 将消息存储在磁盘上,存储的方式基于 消息队列(Topic)消息队列分区(Queue)消息的日志存储格式,它的消息存储由多个 CommitLog 文件和 ConsumeQueue 文件组成。

CommitLog(提交日志)
  • CommitLog 是 RocketMQ 的核心消息存储文件,所有消息都被追加到这个日志文件中。
  • 每一条消息都会按顺序写入到 CommitLog 中,消息内容包括消息的元数据和消息体。
  • RocketMQ 会维护多个 CommitLog 文件,通常使用循环写的方式。新的消息会被追加到当前文件,文件达到一定大小时会自动切换到下一个文件。
ConsumeQueue(消费队列)
  • ConsumeQueue 是与消息的消费相关的文件,它记录了消息在 CommitLog 中的位置。每个 Topic 下的每个消息队列(Queue)都会有一个对应的 ConsumeQueue。
  • 消费者会通过 ConsumeQueue 来读取消息的位置信息,而不需要每次都去查找 CommitLog 中的实际内容。ConsumeQueue 的大小通常会比 CommitLog 小很多,因为它只保存消息的偏移量和一些简单的元数据。
IndexFile(索引文件)
  • IndexFile 用于加速消息的检索过程。RocketMQ 会定期维护一个基于 CommitLog 中消息的索引,索引文件记录了消息在 CommitLog 中的位置信息,这使得消费者能够快速定位到指定的消息。

2. 消息存储流程

消息存储的流程主要分为以下几个步骤:

1. 消息的写入(写入 CommitLog)
  • 当生产者发送消息时,消息会首先被写入到 Broker 的 CommitLog 文件中。
  • 写入的方式是追加到文件末尾,RocketMQ 采用的是 顺序写入,以提高磁盘 I/O 的效率。
  • 每条消息被存储时,都会有一个独特的消息 ID,以及消息的相关元数据,如主题、标签、时间戳等。
2. 消息索引的建立(更新 IndexFile)
  • RocketMQ 会在消息写入 CommitLog 的同时,生成一个索引文件,将消息在 CommitLog 中的偏移量和一些关键字(如消息 ID、主题等)记录到 IndexFile 中。
  • 消息的索引文件支持基于主题、消息 ID 等条件进行快速查找。
3. 消费队列(ConsumeQueue)的创建与更新
  • 每当消息被写入 CommitLog 后,消息的偏移量和基本信息会被写入到 ConsumeQueue
  • ConsumeQueue 文件的大小较小,存储的是每条消息的偏移量、消息大小等简单信息,消费者可以通过读取 ConsumeQueue 来获取消息位置信息,避免每次都读取完整的 CommitLog 文件。
4. 消息的过期和清理
  • RocketMQ 使用 消息清理策略 来管理消息的过期。消息的过期时间可以根据配置来设置,当消息达到过期时间后,系统会定期清理不再需要的消息。
  • 消息的清理主要通过两种方式:
    1. 过期删除:根据消息的时间戳判断是否过期。
    2. 日志文件滚动:当 CommitLog 文件的大小达到限制时,系统会自动切换到下一个文件,过期的文件会被标记并清理。

3. 存储的容错和高可用

RocketMQ 提供了 高可用性容错机制 来确保消息不会丢失。具体包括以下几点:

1. 消息的复制(Broker 高可用)
  • RocketMQ 支持消息的 主从复制。每个 Broker 可以有多个 副本,通过复制机制保证消息的高可用性。
  • 当某个 Broker 挂掉时,其他副本可以继续提供消息的读写操作,避免消息丢失。
2. 持久化
  • 所有消息在写入时都会 持久化 到磁盘上。即使 Broker 挂掉,消息也不会丢失。RocketMQ 使用了 强一致性 和 事务消息 来保证在分布式环境下消息存储的可靠性。
3. 消息确认机制
  • 生产者发送消息时,可以设置消息是否需要确认(ACK)。如果消息成功写入 CommitLog,Broker 会确认该消息,并返回给生产者。

4. RocketMQ 存储的文件结构

RocketMQ 的存储结构大致如下:

/home/rocketmq/store
├── commitlog               # 存储所有消息的 CommitLog 文件
├── consumequeue            # 存储每个消息队列的消息位置信息
├── index                   # 存储消息索引信息
├── translog                # 存储事务日志
├── checkpoint              # 存储消息偏移量的元数据
└── lock                    # 存储 Broker 锁文件
  • commitlog:消息的原始存储位置。
  • consumequeue:每个 Topic 下,每个 Queue 对应的消费队列文件。
  • index:用于加速消息查询的索引文件。
  • translog:存储事务相关的信息。
  • checkpoint:存储有关消费位置和进度的文件。
  • lock:锁文件用于 Broker 启动时进行加锁。

5. 总结

RocketMQ 的消息存储设计非常注重高效性、可扩展性和可靠性。通过 CommitLogConsumeQueueIndexFile 等多种文件机制,RocketMQ 提供了 高吞吐量 的消息存储能力,并且通过 分布式复制事务消息 等特性保证了消息的可靠性和一致性。此外,RocketMQ 还设计了强大的 过期和清理机制,帮助系统自动管理存储的消息,确保长时间运行的系统性能和稳定性。

相关文章:

RocketMQ消息是如何存储的?

大家好,我是锋哥。今天分享关于【RocketMQ消息是如何存储的?】面试题。希望对大家有帮助; RocketMQ消息是如何存储的? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 RocketMQ 使用了一个高性能、分布式的消息存储架构…...

Ubuntu 16.04安装Lua

个人博客地址:Ubuntu 16.04安装Lua | 一张假钞的真实世界 在Linux系统上使用以下命令编译安装Lua: curl -R -O http://www.lua.org/ftp/lua-5.3.3.tar.gz tar zxf lua-5.3.3.tar.gz cd lua-5.3.3 make linux test 安装make 编译过程如果提示以下信息…...

【JavaSE】String类常用字符串方法总结

目录 1. length() 求字符串长度 2. isEmpty() 判断字符串是否为空 3. String对象的比较 3.1 equals() 判断字符串是否相同 3.2 compareTo() 比较字符串大小 3.3 compareToIgnoreCase 忽略大小写比较 4. 字符串查找 4.1 charAt() 返回指定索引处的字符 4.2 indexOf() 4…...

python3+TensorFlow 2.x(二) 回归模型

目录 回归算法 1、线性回归 (Linear Regression) 一元线性回归举例 2、非线性回归 3、回归分类 回归算法 回归算法用于预测连续的数值输出。回归分析的目标是建立一个模型,以便根据输入特征预测目标变量,在使用 TensorFlow 2.x 实现线性回归模型时&…...

机器人抓取与操作概述(深蓝)——1

工业机器人:① “臂”的形态 ② “手”的形态 ③ 视觉,力和触觉 1 机器人的不同形态 “臂”的形态 “手”的形态 2 常见的操作任务 操作:插入、推和滑 抓取:两指(平行夹爪)抓取、灵巧手抓取 落地-产…...

简单聊聊“DeepSeek”

目录 DeepSeek一夜火爆并受到广泛关注的优势 技术实力与创新 低成本与高效率 开源与免费 市场策略与应用领域 团队与资金优势 行业认可与媒体关注 DeepSeek在推理效率上的特别之处 多头潜在注意力(MLA) 多词元预测(MTP)…...

使用 Docker + Nginx + Certbot 实现自动化管理 SSL 证书

使用 Docker Nginx Certbot 实现自动化管理 SSL 证书 在互联网安全环境日益重要的今天,为站点或应用部署 HTTPS 已经成为一种常态。然而,手动申请并续期证书既繁琐又容易出错。本文将以 Nginx Certbot 为示例,基于 Docker 容器来搭建一个…...

粒子群算法 笔记 数学建模

引入: 如何找到全局最大值:如果只是贪心的话,容易被局部最大解锁定 方法有:盲目搜索,启发式搜索 盲目搜索:枚举法和蒙特卡洛模拟,但是样例太多花费巨量时间 所以启发式算法就来了,通过经验和规…...

【C语言】结构体与共用体深入解析

在C语言中,结构体(struct)和共用体(union)都是用来存储不同类型数据的复合数据类型,它们在程序设计中具有重要的作用。 推荐阅读:操作符详细解说,让你的编程技能更上一层楼 1. 结构体…...

es6.7.1分词器ik插件安装-和head插件连接es特殊配置

es6.7.1分词器ik插件安装-和head插件连接es特殊配置 如果对运维课程感兴趣,可以在b站上、A站或csdn上搜索我的账号: 运维实战课程,可以关注我,学习更多免费的运维实战技术视频 1.查看es6.7.1和es-head安装位置和es插件路径 [ro…...

java求职学习day18

常用的设计原则和设计模式 1 常用的设计原则(记住) 1.1 软件开发的流程 需求分析文档、概要设计文档、详细设计文档、编码和测试、安装和调试、维护和升级 1.2 常用的设计原则 (1)开闭原则(Open Close Principle…...

单链表专题(上)

链表的定义与创建 线性表: 1. 物理结构上不一定是线性的 2. 逻辑结构上一定是线性的 链表是一种物理存储结构上非连续,非顺序的存储结构 链表也是线性表的一种,但是在物理结构上不是连续的 链表是由一个一个的节点组成,需要数…...

【stm32学习】STM32F103相关特性

| 名称 | 缩写 | 频率 | 外部连接 | 功能 | 用途 | 特性 | |--------------------|------|----------------|---------------|------------|--------------|----------------| | 外部高速晶体振荡器 | HSE | 4~16MHz …...

PostGIS笔记:PostgreSQL中表、键和索引的基础操作

创建、查看与删除表 在数据库中创建一个表,使用如下代码: create table streets (id serial not null primary key, name varchar(50));这里的表名是streets,id是主键所以非空,采用serial数据类型,这个数据类型会自动…...

蓝桥杯python语言基础(3)——循环结构

一、for语句 理解range函数 range(start, stop, step) start: 序列开始的数字(默认为0)。stop: 序列结束的数字(不包含stop)。step: 步长(默认为1)。 练习 输出在 l 和 r 之间的所有偶数: pri…...

微服务网关鉴权之sa-token

目录 前言 项目描述 使用技术 项目结构 要点 实现 前期准备 依赖准备 统一依赖版本 模块依赖 配置文件准备 登录准备 网关配置token解析拦截器 网关集成sa-token 配置sa-token接口鉴权 配置satoken权限、角色获取 通用模块配置用户拦截器 api模块配置feign…...

23【进制的理解】

很多人可能听过计算机的最底层是2进制执行,但是原理并不知道,我们今天先不讨论那么复杂的问题,先讨论什么是进制 1910,10并不是1个字符,而是2个字符,也就是说在10进制里面没有“10”这个字符,1…...

jemalloc 5.3.0的tsd模块的源码分析

一、背景 在主流的内存库里,jemalloc作为android 5.0-android 10.0的默认分配器肯定占用了非常重要的一席之地。jemalloc的低版本和高版本之间的差异特别大,低版本的诸多网上整理的总结,无论是在概念上和还是在结构体命名上在新版本中很多都…...

【Convex Optimization Stanford】Lec3 Function

【Convex Optimization Stanford】Lec3 Function 前言凸函数的定义对凸函数在一条线上的限制增值扩充? 一阶条件二阶条件一些一阶/二阶条件的例子象集和sublevel set关于函数凸性的扩展(Jesen Inequality)保持函数凸性的操作非负加权和 & 仿射函数的…...

深入 Rollup:从入门到精通(三)Rollup CLI命令行实战

准备阶段:初始化项目 初始化项目,这里使用的是pnpm,也可以使用yarn或者npm # npm npm init -y # yarn yarn init -y # pnpm pnpm init安装rollup # npm npm install rollup -D # yarn yarn add rollup -D # pnpm pnpm install rollup -D在…...

Unity3D中Gfx.WaitForPresent优化方案

前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...

从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路

进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)

前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块&#xff0c…...

七、数据库的完整性

七、数据库的完整性 主要内容 7.1 数据库的完整性概述 7.2 实体完整性 7.3 参照完整性 7.4 用户定义的完整性 7.5 触发器 7.6 SQL Server中数据库完整性的实现 7.7 小结 7.1 数据库的完整性概述 数据库完整性的含义 正确性 指数据的合法性 有效性 指数据是否属于所定…...

【从零学习JVM|第三篇】类的生命周期(高频面试题)

前言: 在Java编程中,类的生命周期是指类从被加载到内存中开始,到被卸载出内存为止的整个过程。了解类的生命周期对于理解Java程序的运行机制以及性能优化非常重要。本文会深入探寻类的生命周期,让读者对此有深刻印象。 目录 ​…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四&#xff…...

快刀集(1): 一刀斩断视频片头广告

一刀流:用一个简单脚本,秒杀视频片头广告,还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农,平时写代码之余看看电影、补补片,是再正常不过的事。 电影嘛,要沉浸,…...

苹果AI眼镜:从“工具”到“社交姿态”的范式革命——重新定义AI交互入口的未来机会

在2025年的AI硬件浪潮中,苹果AI眼镜(Apple Glasses)正在引发一场关于“人机交互形态”的深度思考。它并非简单地替代AirPods或Apple Watch,而是开辟了一个全新的、日常可接受的AI入口。其核心价值不在于功能的堆叠,而在于如何通过形态设计打破社交壁垒,成为用户“全天佩戴…...

全面解析数据库:从基础概念到前沿应用​

在数字化时代,数据已成为企业和社会发展的核心资产,而数据库作为存储、管理和处理数据的关键工具,在各个领域发挥着举足轻重的作用。从电商平台的商品信息管理,到社交网络的用户数据存储,再到金融行业的交易记录处理&a…...