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 使用 消息清理策略 来管理消息的过期。消息的过期时间可以根据配置来设置,当消息达到过期时间后,系统会定期清理不再需要的消息。
- 消息的清理主要通过两种方式:
- 过期删除:根据消息的时间戳判断是否过期。
- 日志文件滚动:当 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 的消息存储设计非常注重高效性、可扩展性和可靠性。通过 CommitLog、ConsumeQueue、IndexFile 等多种文件机制,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在…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别
UnsatisfiedLinkError 在对接硬件设备中,我们会遇到使用 java 调用 dll文件 的情况,此时大概率出现UnsatisfiedLinkError链接错误,原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用,结果 dll 未实现 JNI 协…...
YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?
现有的 Redis 分布式锁库(如 Redisson)相比于开发者自己基于 Redis 命令(如 SETNX, EXPIRE, DEL)手动实现分布式锁,提供了巨大的便利性和健壮性。主要体现在以下几个方面: 原子性保证 (Atomicity)ÿ…...
华为OD机试-最短木板长度-二分法(A卷,100分)
此题是一个最大化最小值的典型例题, 因为搜索范围是有界的,上界最大木板长度补充的全部木料长度,下界最小木板长度; 即left0,right10^6; 我们可以设置一个候选值x(mid),将木板的长度全部都补充到x,如果成功…...
从零开始了解数据采集(二十八)——制造业数字孪生
近年来,我国的工业领域正经历一场前所未有的数字化变革,从“双碳目标”到工业互联网平台的推广,国家政策和市场需求共同推动了制造业的升级。在这场变革中,数字孪生技术成为备受关注的关键工具,它不仅让企业“看见”设…...
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑
精益数据分析(98/126):电商转化率优化与网站性能的底层逻辑 在电子商务领域,转化率与网站性能是决定商业成败的核心指标。今天,我们将深入解析不同类型电商平台的转化率基准,探讨页面加载速度对用户行为的…...
