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 使用了一个高性能、分布式的消息存储架构…...
在FreeBSD下安装Ollama并体验DeepSeek r1大模型
在FreeBSD下安装Ollama并体验DeepSeek r1大模型 在FreeBSD下安装Ollama 直接使用pkg安装即可: sudo pkg install ollama 安装完成后,提示: You installed ollama: the AI model runner. To run ollama, plese open 2 terminals. 1. In t…...
[250128] Apache HTTP Server 2.4.63 发布 | Arm 发布首个芯片系统架构的公开规范
目录 Apache HTTP Server 2.4.63 发布,十五年创新成果!Arm 发布首个芯片系统架构的公开规范 Apache HTTP Server 2.4.63 发布,十五年创新成果! Apache 软件基金会和 Apache HTTP Server 项目组自豪地宣布 Apache HTTP Server 2.4…...
为什么要学习rust
内存管理:对于我来说,我就喜欢它的内存管理。我做了一个webapi,取100万行数据,导出到xlsx,再把这个xlsx文件发送给前端。分别用了java、c#、go和rust进行了相同的操作。只有rust做到了,启动时8MB内存&#…...
Linux进程调度与等待:背后的机制与实现
个人主页:chian-ocean 文章专栏-Linux 前言: 当一个进程发起某种操作(如I/O请求、信号、锁的获取等),但该操作需要的资源暂时不可用时,进程会被操作系统挂起,进入“等待队列”或“阻塞状态”。…...
Linux任务管理与守护进程
文章目录 🍅任务管理进程组概念作业概念会话概念相关操作前台进程&后台进程jobsfgbgps命令查看指定的选项 🫒守护进程守护进程的概念作用守护进程的查看守护进程的创建原生创建守护进程调用daemon函数创建守护进程模拟实现daemon函数 🍅任…...
《Trustzone/TEE/安全从入门到精通-标准版》
CSDN学院课程连接:https://edu.csdn.net/course/detail/39573 讲师介绍 拥有 12 年手机安全、汽车安全、芯片安全开发经验,擅长 Trustzone/TEE/ 安全的设计与开发,对 ARM 架构的安全领域有着深入的研究和丰富的实践经验,能够将复杂的安全知识和处理器架构知识进行系统整…...
java 字符串日期字段格式化前端显示
在 Java 应用程序中,如果你有一个字符串类型的日期字段,并希望将其格式化后显示在前端,可以通过多种方式实现。这通常涉及到在后端将字符串转换为 Date 或 LocalDateTime 等对象,然后使用适当的注解或配置来确保它们以正确的格式序…...
LabVIEW橡胶动态特性测试系统
本文介绍了一个利用LabVIEW软件和NI高速数据采集设备构建的橡胶动态特性测试系统。该系统实现了橡胶材料动态性能的精确测量,并通过虚拟仪器技术,提高了测试数据的处理效率和准确性。系统支持实时数据处理和多种信号的动态分析,适用于工业和科…...
deepseek-r1 本地部署
deepseek 最近太火了 1:环境 win10 cpu 6c 内存 16G 2: 部署 1>首先下载ollama 官网:https://ollama.com ollama 安装在c盘 模型可以配置下载到其他盘 OLLAMA_MODELS D:\Ollama 2>下载模型并运行 ollama run deepseek-r1:<标签> 1.5b 7b 8…...
28. 【.NET 8 实战--孢子记账--从单体到微服务】--简易报表--报表定时器与报表数据修正
这篇文章是《.NET 8 实战–孢子记账–从单体到微服务》系列专栏的《单体应用》专栏的最后一片和开发有关的文章。在这片文章中我们一起来实现一个数据统计的功能:报表数据汇总。这个功能为用户查看月度、年度、季度报表提供数据支持。 一、需求 数据统计方面&…...
具身智能技术趋势
参考: 【北京大学-董豪】具身智能技术趋势分析 2024.8 回答了具身智能技术G3、G4的必要性,以及真实数据、仿真数据、互联网数据之间的关系 具身智能趋势 趋势:寻求一个通用路径实现所有的上肢操作 要求:① 低成本 ② 拓展到所有…...
JavaScript逆向高阶指南:突破基础,掌握核心逆向技术
JavaScript逆向高阶指南:突破基础,掌握核心逆向技术 JavaScript逆向工程是Web开发者和安全分析师的核心竞争力。无论是解析混淆代码、分析压缩脚本,还是逆向Web应用架构,掌握高阶逆向技术都将助您深入理解复杂JavaScript逻辑。本…...
C#面试常考随笔6:ArrayList和 List的主要区别?
在 C# 中,ArrayList和List<T>(泛型列表)都可用于存储一组对象。推荐优先使用List<T>,因为它具有更好的类型安全性、性能和语法简洁性,并且提供了更丰富的功能。只有在需要与旧代码兼容或存储不同类型对象的…...
【数据结构】 并查集 + 路径压缩与按秩合并 python
目录 前言模板朴素实现路径压缩按秩合并按树高为秩按节点数为秩 总结 前言 并查集的基本实现通常使用森林来表示不同的集合,每个集合用一棵树表示,树的每个节点有一个指向其父节点的指针。 如果一个节点是它自己的父节点,那么它就是该集合的代…...
使用 Redis List 和 Pub/Sub 实现简单的消息队列
使用 Redis List 和 Pub/Sub 实现简单的消息队列 Redis 本身不是专门的消息队列系统,但它提供了多种数据结构(如 List、Pub/Sub、Stream)来实现消息队列功能。根据不同的业务需求,可以选择不同的方式: 在 Redis 中&a…...
aerodrome交易所读合约分析
池地址 0xb2cc224c1c9fee385f8ad6a55b4d94e92359dc59token0 0x4200000000000000000000000000000000000006token1 0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913tickSpacing 100stakedLiquidity 4579376109215388530 snapshotCumulativesInside tickLower tickUpperslot0 …...
mybatis(112/134)
多对一 第一种方法: 一的表参数设置: <association property"clazz" javaType"Clazz"> <id property"cid" column"cid"/> <result property"cname" column"cname"/> <…...
Node.js与MySQL模块结合:打造安全高效的用户信息管理系统
摘要 本文探讨使用Node.js构建前端项目并导入MySQL模块创建数据库连接对象的方法。文中讲解了共享数据库连接对象,定义SQL语句查询和更新用户信息(排除密码字段以保护隐私),以及根据用户ID更新基本信息、重置密码和更新头像的具体…...
【C++】设计模式详解:单例模式
文章目录 Ⅰ. 设计一个类,不允许被拷贝Ⅱ. 请设计一个类,只能在堆上创建对象Ⅲ. 请设计一个类,只能在栈上创建对象Ⅳ. 请设计一个类,不能被继承Ⅴ. 请设计一个类,只能创建一个对象(单例模式)&am…...
在ubuntu下一键安装 Open WebUI
该脚本用于自动化安装 Open WebUI,并支持以下功能: 可选跳过 Ollama 安装:通过 --no-ollama 参数跳过 Ollama 的安装。自动清理旧目录:如果安装目录 (~/open-webui) 已存在,脚本会自动删除旧目录并重新安装。完整的依…...
【某大厂一面】数组和链表区别
在 Java 中,数组(Array)和链表(LinkedList)是两种常见的数据结构,它们在存储和操作方式上有显著的区别。了解它们的差异有助于选择适合特定应用场景的结构。下面是数组和链表之间的详细比较。 1. 存储结构…...
MySQL常用数据类型和表的操作
文章目录 (一)常用数据类型1.数值类2.字符串类型3.二进制类型4.日期类型 (二)表的操作1查看指定库中所有表2.创建表3.查看表结构和查看表的创建语句4.修改表5.删除表 (三)总代码 (一)常用数据类型 1.数值类 BIT([M]) 大小:bit M表示每个数的位数,取值范围为1~64,若…...
深入 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在…...
3.日常英语笔记
screening discrepancies 筛选差异 The team found some screening discrepancies in the data. 团队在数据筛选中发现了些差异。 Don’t tug at it ,or it will fall over and crush you. tug 拉,拽,拖 He tugged the door open with all his might…...
sqlite3 学习笔记
文章目录 前言SQL的概念与表格相关的操作i.创建表格(增)ii 删除表格(删)iii 更改表格(改)iv 查询表格(查) 与记录相关的操作i 插入记录ii 删除记录iii 查询记录iv 修改记录 Linux中使…...
C++ | 红黑树
前言 本篇博客讲解c中数据结构红黑树,看这篇博客之前请先去看: C | AVL树_c avl树能有重复节点吗-CSDN博客 💓 个人主页:普通young man-CSDN博客 ⏩ 文章专栏:C_普通young man的博客-CSDN博客 ⏩ 本人giee: 普通小青…...
使用Ollama 在Ubuntu运行deepseek大模型:以DeepSeek-coder为例
DeepSeek大模型这几天冲上热搜啦! 咱们来亲身感受下DeepSeek模型的魅力吧! 整个操作流程非常简单方便,只需要2步,先安装Ollama,然后执行大模型即可。 安装Ollama 在Ubuntu下安装Ollama非常简单,直接sna…...
詳細講一下RN(React Native)中的列表組件FlatList和SectionList
1. FlatList 基礎使用 import React from react; import { View, Text, FlatList, StyleSheet } from react-native;export const SimpleListDemo: React.FC () > {// 1. 準備數據const data [{ id: 1, title: 項目 1 },{ id: 2, title: 項目 2 },{ id: 3, title: 項目 3…...
《深度揭秘:TPU张量计算架构如何重塑深度学习运算》
在深度学习领域,计算性能始终是推动技术发展的关键因素。从传统CPU到GPU,再到如今大放异彩的TPU(张量处理单元),每一次硬件架构的革新都为深度学习带来了质的飞跃。今天,就让我们深入探讨TPU的张量计算架构…...
QT使用eigen
QT使用eigen 1. 下载eigen https://eigen.tuxfamily.org/index.php?titleMain_Page#Download 下载后解压 2. QT引入eigen eigen源码好像只有头文件,因此只需要引入头文件就好了 qt新建项目后。修改pro文件. INCLUDEPATH E:\222078\qt\eigen-3.4.0\eigen-3.…...
工业“MCU+AI”
随着工业4.0的推进,传统工业设备正向智能化和自动化方向转型。这要求设备具备更高的算力、更强的实时处理能力以及支持AI算法的能力,以应对工业机器人、电机控制、预测性维护等复杂应用场景。 近年来越来越多的芯片厂商纷纷推出工业“MCUAI”产品&#…...
【Linux】Linux C判断两个IPv6地址是否有包含关系
功能说明 要判断两个 IPv6 地址是否具有包含关系,包括前缀的比较,可以通过以下步骤实现: 解析 IPv6 地址和前缀:将两个 IPv6 地址和它们的前缀长度解析为二进制形式。生成掩码:根据前缀长度生成掩码。按位比较&#…...
多模态论文笔记——TECO
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文TECO(Temporally Consistent Transformer),即时间一致变换器,是一种用于视频生成的创新模型&…...
AI学习(vscode+deepseek+cline)
1、网页生成不成功时,直接根据提示让模型替你解决问题 2、http://localhost:3000 拒绝链接时,cmd输入命令InetMgr,网站右键新建-配置你的网页代码物理地址,这里我还输入本机登录名及密码了,并把端口地址由默认80修改为…...
物业软件推动物业行业数字化转型 实现高效管理和优质客户体验
内容概要 在当今高速发展的数字化时代,物业软件的出现不仅使物业管理变得更加高效,也为行业转型提供了强大的支持。通过整合多种功能,物业软件显著提升了管理效率和客户体验。例如,在线收费和停车管理功能,让业主享受…...
WGCLOUD使用手册 - 登录验证码如何设置
登录页面默认是不用输入验证码的,但是我们也可以根据自己的实际场景,配置登录页面显示验证码,要求用户输入 提示:您需要需要升级到v3.5.3或以上版本,才可以支持此功能 我们在server配置文件里找到配置项vercodeCheck&…...
C# 9.0记录类型:解锁开发效率的魔法密码
一、引言:记录类型的神奇登场 在 C# 的编程世界中,数据结构就像是构建软件大厦的基石,其重要性不言而喻。然而,传统的数据结构定义方式,尤其是在处理简单的数据承载对象时,常常显得繁琐复杂。例如…...
Python 函数魔法书:基础、范例、避坑、测验与项目实战
Python 函数魔法书:基础、范例、避坑、测验与项目实战 内容简介 本系列文章是为 Python3 学习者精心设计的一套全面、实用的学习指南,旨在帮助读者从基础入门到项目实战,全面提升编程能力。文章结构由 5 个版块组成,内容层层递进…...
Unbutu虚拟机+eclipse+CDT编译调试环境搭建
问题1: 安装CDT,直接Help->eclipse Market space-> 搜cdt , install,等待重启即可. 问题2:C变量不识别vector ’could not be resolved 这是库的头文件没加好,右键Properties->C Build->Enviroment,增加…...
项目部署(springboot项目)
1、安装Nginx,并开启 2、前端项目打包:npm run build:prod--->dist 3、后端项目打包:install--->xxx.jar 4、开放需要的端口号:比如我的后端项目端口号为8282,则需要防火墙和服务器同时开发8282端口 5、将di…...
Spring MVC拦截器
文章目录 1. 拦截器(interceptor)的作用2. 拦截器和过滤器区别3. 拦截器是快速入门 1. 拦截器(interceptor)的作用 Spring MVC 的拦截器类似于 Servlet 开发中的过滤器 Filter,用于对处理器进行预处理和后处理。 将拦截器按一定的顺序联结成一条链,这条…...
Nginx 路由匹配(Nginx Route Matching)
从小白到高手:深入Nginx 路由匹配 在现代互联网应用中,Nginx 作为一款高性能的 Web 服务器,因其灵活性和高效性而广泛应用于各类网站和服务。Nginx 的路由匹配规则是其核心功能之一,负责决定如何处理传入的请求。通过这些规则&am…...
基于RIP的MGRE实验
实验拓扑 实验要求 按照图示配置IP地址配置静态路由协议,搞通公网配置MGRE VPNNHRP的配置配置RIP路由协议来传递两端私网路由测试全网通 实验配置 1、配置IP地址 [R1]int g0/0/0 [R1-GigabitEthernet0/0/0]ip add 15.0.0.1 24 [R1]int LoopBack 0 [R1-LoopBack0]i…...
Spring Boot 中的事件发布与监听:深入理解 ApplicationEventPublisher(附Demo)
目录 前言1. 基本知识2. Demo3. 实战代码 前言 🤟 找工作,来万码优才:👉 #小程序://万码优才/r6rqmzDaXpYkJZF 基本的Java知识推荐阅读: java框架 零基础从入门到精通的学习路线 附开源项目面经等(超全&am…...
【Java基础-41.5】深入解析Java异常链:构建清晰的错误追踪体系
在Java编程中,异常处理是保证程序健壮性和可维护性的重要部分。然而,在实际开发中,异常往往不是孤立发生的,而是由一系列相关的异常引发的。为了更好地理解和处理这种复杂的异常场景,Java引入了 异常链(Exc…...
STM32使用VScode开发
文章目录 Makefile形式创建项目新建stm项目下载stm32cubemx新建项目IED makefile保存到本地arm gcc是编译的工具链G++配置编译Cmake +vscode +MSYS2方式bilibiliMSYS2 统一环境配置mingw32-make -> makewindows环境变量Cmake CmakeListnijia 编译输出elfCMAKE_GENERATOR查询…...
特权模式docker逃逸
目录 1.环境 2.上线哥斯拉 3.特权模式逃逸 1.判断是否为docker环境 2.判断是否为特权模式 3.挂载宿主机磁盘到docker 4.计划任务反弹shell 1.环境 ubuntu部署一个存在CVE-2017-12615的docker: (ip:192.168.117.147) kali(ip:192.168.117.128) 哥斯拉 2.上线哥斯拉…...
装出字符串中国第一个匹配项的下标
hello 大家好!今天开写一个新章节,每一天一道算法题。让我们一起来学习算法思维吧! function strStr(haystack, needle) {return haystack.indexOf(needle); }// 测试示例 const haystack "sadbutsad"; const needle "sad&q…...
从腾讯云数据仓库TCHouse安全地转移数据到AWS Redshift
实现从AWS Direct Connect连接到腾讯云数据仓库TCHouse-P、TCHouse-C或TCHouse-D,然后使用AWS Glue读取数据并在AWS Redshift中创建对应表并复制数据,需要按照以下步骤进行操作: 网络连接设置 AWS Direct Connect配置: 在AWS管理…...