【RocketMQ】从 文件/数据结构 视角理解RocketMQ原理

news2024/9/28 23:34:20

目录

  • 1. NameServer 文件结构和数据结构
  • 2. Broker 文件结构和数据结构
    • 2.1 CommitLog
    • 2.2 ConsumeQueue
    • 2.3 IndexFile
    • 2.4 TopicTable
    • 2.5 SubscriptionGroupTable
    • 2.6 ConsumerOffset
    • 2.7 DelayQueue
  • 3. 客户端(生产者/消费者)的文件结构和数据结构
    • 3.1 Producer 端数据结构
    • 3.2 Consumer 端数据结构
    • 3.3 OffsetStore
  • 4. RocketMQ 的文件和数据结构总结

1. NameServer 文件结构和数据结构

NameServer 是一个无状态的节点,用于维护 Broker 和 Topic 的路由信息,不涉及持久化文件,所有数据都存储在内存中。

•	RouteInfoManager:主要的数据结构,包含以下几部分:
	•	BrokerLiveTable:记录每个 Broker 的存活状态及其 IP、端口等信息,存活状态通过心跳机制维护。
	•	BrokerAddrTable:存储 Broker 名字对应的多个 Broker 节点(Master 和 Slave)的地址。
	•	TopicQueueTable:HashMap<String, List<QueueData>>,记录每个 Topic 对应的 QueueData,即每个 Topic 在不同 Broker 上的读写队列分布情况。

NameServer 的主要功能是提供路由信息,所有数据都是通过心跳和路由注册进行同步,定期向客户端提供最新的 Topic 和 Broker 信息。

注:因为没有持久化文件所有数据都存在内存中,所以节点重启之后无法从文件恢复、信息会丢失,所以才成为“无状态”
虽然NameServer是无状态,但是在集群环境下,多个NameServer节点的容灾能力还是可以的:

  • 启动之初,Broker们需要向所有的NameServer建立长链接并注册自身信息
  • 之后通过长链接,NameServer们不断从Broker更新注册信息
  • 也是通过长链接,Broker向NameServer们发动自身心跳
  • 同理生产、消费者需要配置所有的NameServer地址、之后走负载均衡来请求具体的NameServer获取Broker信息等

2. Broker 文件结构和数据结构

Broker 是 RocketMQ 的核心组件,负责消息的存储、转发及管理。它维护了多个核心文件结构和数据结构:

2.1 CommitLog

•	CommitLog 是 Broker 存储消息的主要文件,底层采用顺序写的文件系统。
•	文件结构:每个 CommitLog 文件大小是固定的(通常1GB),消息以顺序的方式写入文件中,多个文件形成一个链表。
•	功能:持久化所有的消息内容,支持高效的顺序写,以保证消息写入性能。支持消息的定期刷盘策略(同步或异步刷盘)。

同步或者异步刷盘是需要权衡的一件事情

  • 同步:避免了大部分的消息丢失场景、可靠性高,但是同时效率底、降低吞吐量
  • 异步:快速响应、提升吞吐量,但是存在消息丢失的风险

2.2 ConsumeQueue

•	ConsumeQueue 是针对每个 MessageQueue(消息队列)维护的消息索引文件,主要记录消息在 CommitLog 中的物理偏移量。
•	文件结构:每个 ConsumeQueue 文件的条目包含了消息的 CommitLog 偏移量、消息大小和消息 Tag 的哈希值。
•	功能:通过这个索引可以快速定位到消息在 CommitLog 中的位置,提升消息消费的效率。

所谓的读写队列,都是基于ConsumeQueue来的

2.3 IndexFile

•	IndexFile 是 Broker 提供的额外索引机制,基于哈希索引建立。每条消息可以通过唯一的 Key 和消息发送时间建立索引。
•	文件结构:存储 CommitLog 中消息的物理偏移量和 Key/时间的映射关系。
•	功能:提供消息的快速查询能力,允许通过 Key 或时间范围进行消息的精确查询。

2.4 TopicTable

•	TopicTable 是 Broker 中管理 Topic 元数据信息的核心数据结构,类似于一个 HashMap:
	HashMap<String, TopicConfig> TopicTable;
•	Key:Topic 名称。
•	Value:TopicConfig 对象,包含 Topic 的读写队列数量、权限等信息。
•	功能:负责记录每个 Topic 的队列分布情况及其权限控制。TopicTable 信息定期同步到 NameServer。

2.5 SubscriptionGroupTable

•	SubscriptionGroupTable:维护每个消费者组的订阅关系。它记录了每个消费者组可以消费哪些 Topic 以及消费权限等信息。

2.6 ConsumerOffset

•	ConsumerOffset:每个消费者组对 MessageQueue 的偏移量文件,用于记录消费者组当前消费到哪条消息,持久化存储在磁盘上。
•	文件结构:每个消费者组对应一个文件,记录它对每个 MessageQueue 的偏移量。
•	功能:消费者重启时可以从该偏移量继续消费消息,保证消费的可追溯性。

2.7 DelayQueue

•	DelayQueue:用于存储延时消息的消息队列。
•	文件结构:采用分层的时间轮机制,存储到期的延迟消息。5.0 版本后使用了基于时间轮的延时消息队列结构,提供更高效的延时消息支持。

DelayQueue严格来讲只是个概念上的队列、而不是个实际存在的文件或者结构,这玩意儿实际就是个时间轮(TimeWheel)结构、放在内存里,它重启之后会丢失,好在时间轮可以重建(依赖CommitLog中原始的消息信息)

3. 客户端(生产者/消费者)的文件结构和数据结构

客户端 包括生产者和消费者,通常没有涉及复杂的文件系统,但是也有一些关键的内存数据结构用于消费和生产消息。

3.1 Producer 端数据结构

•	MQClientInstance:生产者端的核心类,用于维护与 Broker 的网络连接及路由信息缓存。
•	TopicPublishInfo:记录每个 Topic 的路由信息,包括哪些 Broker 上有读写队列,生产者可以基于这个信息选择合适的队列发送消息。

3.2 Consumer 端数据结构

•	PullMessageService:负责从 Broker 拉取消息的服务。
•	RebalanceImpl:负责消费队列的负载均衡算法,确保不同消费者组之间均衡地消费 Topic 下的队列。

3.3 OffsetStore

•	OffsetStore:消费者端保存消息消费偏移量的组件,支持本地存储和远程存储两种模式。
	•	LocalFileOffsetStore:将偏移量保存在本地文件系统中,适用于本地模式的消费者。
	•	RemoteBrokerOffsetStore:将偏移量保存在 Broker 中,适用于集群模式下的消费者。
  • 集群模式下,offset文件放在broker中就行了,意思是你们一群人来消费,我具备公信力、所以我记录下你们消费到哪里了
  • 广播模式下,offset文件放到消费者侧,意思是你们各自消费,我总不能谁消费到哪里了我都记录,这样太麻烦我了,你们各自记住自己消费到哪里了

4. RocketMQ 的文件和数据结构总结

•	NameServer:无状态节点,核心结构是 RouteInfoManager,维护 Broker 和 Topic 路由信息。
•	Broker:
•	CommitLog:存储消息的文件,采用顺序写,支持高效持久化。
•	ConsumeQueue:索引文件,存储每个消息队列的物理偏移量,提升消费性能。
•	IndexFile:消息的哈希索引文件,支持通过 Key 和时间查询。
•	TopicTable:记录 Topic 的元数据信息,包括读写队列配置。
•	ConsumerOffset:记录消费者消费的偏移量。
•	DelayQueue:延时消息存储队列,采用时间轮机制。
•	客户端:
•	Producer:维护 Topic 的路由信息,用于选择合适的 Broker。
•	Consumer:通过 PullMessageService 拉取消息,使用 RebalanceImpl 进行负载均衡,依赖 OffsetStore 记录消费偏移量。

通过这些核心文件结构和数据结构,RocketMQ 实现了消息的高效存储、消费、索引以及负载均衡等功能,并通过 NameServer 保证系统的高可用性和可扩展性。

以上个人的一个总结,欢迎大家指正补充,转载标明出处谢谢;

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

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

相关文章

讯飞星火编排创建智能体学习(二)决策节点

目录 概述 决策节点 文生图节点 连接节点 测试结果 概述 在上一篇博文讯飞星火编排创建智能体学习&#xff08;一&#xff09;最简单的智能体构建-CSDN博客&#xff0c;我介绍了编排创作智能体&#xff0c;这篇来介绍一下“决策节点”。 决策节点 在编排创作智能体中&…

YOLOv8最新改进2023 CVPR 结合BiFormer

1,原理部分 作为视觉转换器的核心构建块,衰减是捕获长距离依赖性的强大工具。然而,这种能力是有代价的:它会产生巨大的计算负担和沉重的内存占用,因为所有空间位置的成对标记交互都是计算的。一系列作品试图通过将手工制作和与内容无关的稀疏性引入 attention 来缓解这个问…

一文上手skywalking【上】

一、skywalking预览 1.1 skywalking 概述 ​ Apache SkyWalking, 适用于分布式系统的应用程序性能监控工具&#xff0c;专为微服务、云原生和基于容器的 &#xff08;Kubernetes&#xff09; 架构而设计。官方地址: https://skywalking.apache.org/ 适用于分布式系统的应用程…

从密码学看盲拍合约:智能合约的隐私与安全新革命!

文章目录 前言一、什么是盲拍合约&#xff1f;二、盲拍合约的优势1.时间压力的缓解2.绑定与秘密的挑战 三、盲拍合约的工作原理1.提交盲出价2.披露出价3.结束拍卖4.退款机制 四、代码示例总结 前言 随着区块链技术的发展&#xff0c;智能合约在各种场景中的应用越来越广泛。盲…

番外篇 | 复现AC-YOLOv5,进行自动化织物缺陷检测

前言:Hello大家好,我是小哥谈。我们提出了一种基于AC-YOLOv5的新型纺织缺陷检测方法。将空洞空间金字塔池化(ASPP)模块引入YOLOv5主干网络中,提出了squeeze-and-excitation(CSE)通道注意力模块,并将其引入到YOLOv5主干网络中。🌈 目录 🚀1.基础概念 🚀2.添…

【d54_2】【Java】【力扣】142.环形链表

思路 关于判断是否重复的就hashSet&#xff0c;这种有主动去重性质的类 新建一个hashSet 遍历链表并放进hashSet&#xff0c; 如果不能放&#xff0c;说明这个遍历过&#xff0c;这个就是环的地方 如果最后到遍历到null&#xff0c;说明没环 代码 /*** Definition for s…

5.3 克拉默法则、逆矩阵和体积

本节是使用代数而不是消元法来求解 A x b A\boldsymbol x\boldsymbol b Axb 和 A − 1 A^{-1} A−1。所有的公式都会除以 det ⁡ A \det A detA&#xff0c; A − 1 A^{-1} A−1 和 A − 1 b A^{-1}\boldsymbol b A−1b 中的每个元素都是一个行列式除以 A A A 的行列式。…

基于微信小程序的网上商城+ssm(lw+演示+源码+运行)

摘 要 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;微信小程序被用户普遍使用&#xff0c;为方便用户能够可以…

STM32F407单片机编程入门(二十七)以太网接口详解及实战含源码

文章目录 一.概要二.单片机以太网系统基本结构1.OSI 七层模型2.单片机实现以太网功能组成 三.STM32F407VET6单片机以太网内部结构1.MII接口介绍2.RMII接口介绍 四.LWIP TCP/IP协议栈介绍五.PHY收发器LAN8720介绍1.LAN8720内部框图2.LAN8720应用电路3.LAN8720以太网模块 六.Cube…

在公司网络环境下,无法访问公共网络时,可在插件端配置网络代理后使用通义灵码

在公司网络环境下&#xff0c;无法访问公共网络时&#xff0c;可在插件端配置网络代理后使用通义灵码。 通义灵码插件下载&#xff1a;通义灵码_智能编码助手_AI编程-阿里云 配置网络代理 公司网络通常使用 HTTP 代理服务器在网络流量发送到目标位置之前进行拦截&#xff0c;以…

6--苍穹外卖-SpringBoot项目中菜品管理 详解(二)

目录 菜品分页查询 需求分析和设计 代码开发 设计DTO类 设计VO类 Controller层 Service层接口 Service层实现类 Mapper层 功能测试 删除菜品 需求设计和分析 代码开发 Controller层 Service层接口 Service层实现类 Mapper层 功能测试 修改菜品 需求分析和设…

Spring--boot自动配置原理案例--阿里云--starter

Spring–boot自动配置原理案例–阿里云–starter 定义这个starter的作用是它可以将阿里云的工具类自动放入IOC容器中&#xff0c;供人使用。 我们看一看构建starter的过程&#xff0c;其实就是在atuoconfigure模块中加入工具类&#xff0c;然后写一个配置类在其中将工具类放入…

【ChromeDriver安装】爬虫必备

以下是安装和配置 chromedriver 的步骤&#xff1a; 1. 确认 Chrome 浏览器版本 打开 Chrome 浏览器&#xff0c;点击右上角的菜单按钮&#xff08;三个点&#xff09;&#xff0c;选择“帮助” > “关于 Google Chrome”。 2. 下载 Chromedriver 根据你的 Chrome 版本&…

【研赛A题成品论文】24华为杯数学建模研赛A题成品论文+可运行代码丨免费分享

2024华为杯研究生数学建模竞赛A题精品成品论文已出&#xff01; A题 风电场有功功率优化分配 一、问题分析 A题是一道工程建模与优化类问题&#xff0c;其目的是根据题目所给的附件数据资料分析风机主轴及塔架疲劳损伤程度&#xff0c;以及建立优化模型求解最优有功功率分配…

哪些AI软件能轻松搞定你的文案、总结、论文、计划书?

大家好&#xff01;在我们每天紧张忙碌的生活中&#xff0c;有时候一天结束时&#xff0c;我们还有一堆事情等着处理。 图片 但别担心&#xff0c;今天我要为大家介绍几款AI软件&#xff0c;它们可以在你忙碌的一天结束后&#xff0c;成为你的得力助手&#xff0c;帮你轻松管…

初识Tomcat

Tomcat是一款可以运行javaWebAPP的服务器软件。 一个服务器想要执行java代码&#xff0c;则需要JRE&#xff08;jvm、java运行环境等&#xff09;&#xff0c;但是需要执行javaWEB项目则还需要服务器软件&#xff0c;Tomacat就是其中很流行的一款。因为一个javaWEB项目会有很多…

Accelerate单卡,多卡config文件配置

依赖库 from accelerate import Accelerator from accelerate import DistributedDataParallelKwargs ddp_kwargs DistributedDataParallelKwargs(find_unused_parametersTrue) accelerator Accelerator(kwargs_handlers[ddp_kwargs]) 代码中删除所有的.cuda() 或者to(devic…

Xshell连接服务器

一、Xshell-7.0.0164p、Xftp 7下载 1.1、文件下载 通过网盘分享的文件&#xff1a;xshell 链接: https://pan.baidu.com/s/1qc0CPv4Hkl19hI9tyvYZkQ 提取码: 5snq –来自百度网盘超级会员v2的分享 1.2、ip连接 下shell和xftp操作一样&#xff1a;找到文件—》新建—》名称随…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,1-1

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

论文不同写作风格下的ChatGPT提示词分享

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 在学术论文写作中&#xff0c;不同的写作风格能显著影响文章的表达效果与读者的理解。无论是描述性、分析性、论证性&#xff0c;还是批判性写作风格&#xff0c;合理选择和运用恰当的写…