广告
返回顶部
首页 > 资讯 > 精选 >RocketMQ的存储模型怎么掌握
  • 496
分享到

RocketMQ的存储模型怎么掌握

2023-07-04 22:07:50 496人浏览 八月长安
摘要

本篇内容主要讲解“RocketMQ的存储模型怎么掌握”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“RocketMQ的存储模型怎么掌握”吧!RocketMQ简介RocketMQ有Producer、

本篇内容主要讲解“RocketMQ的存储模型怎么掌握”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“RocketMQ的存储模型怎么掌握”吧!

RocketMQ简介

RocketMQ有Producer、Consumer、NameSrv、Broker四个部分。其中Broker用于存储消息,维护消息队列和订阅关系,是RocketMQ四个部分中最重要的一个部分,并且RocketMQ的高性能就是依赖于Broker模块的底层存储模型实现的。所以搞清楚Broker的存储模型是学习RocketMQ最重要的一步。

RocketMQ 优异的性能表现,必然绕不开其优秀的存储模型 。

1 整体概览

首先温习下 RocketMQ 架构

RocketMQ的存储模型怎么掌握

整体架构中包含四种角色 :

  • Producer :消息发布的角色,Producer 通过 MQ 的负载均衡模块选择相应的 Broker 集群队列进行消息投递,投递的过程支持快速失败并且低延迟。

  • Consumer :消息消费的角色,支持以 push 推,pull 拉两种模式对消息进行消费。

  • NameServer :名字服务是一个非常简单的 Topic 路由注册中心,其角色类似 dubbo 中的 ZooKeeper ,支持 Broker 的动态注册与发现。

  • BrokerServer :Broker 主要负责消息的存储、投递和查询以及服务高可用保证 。

本文的重点在于分析 BrokerServer 的消息存储模型。我们先进入 broker 的文件存储目录 。

RocketMQ的存储模型怎么掌握

消息存储和下面三个文件关系非常紧密:

数据文件 commitlog

消息主体以及元数据的存储主体 ;

消费文件 consumequeue

消息消费队列,引入的目的主要是提高消息消费的性能 ;

索引文件 index

索引文件,提供了一种可以通过 key 或时间区间来查询消息。

RocketMQ 采用的是混合型的存储结构,Broker 单个实例下所有的队列共用一个数据文件(commitlog)来存储。

生产者发送消息至 Broker 端,然后 Broker 端使用同步或者异步的方式对消息刷盘持久化,保存至 commitlog 文件中。只要消息被刷盘持久化至磁盘文件 commitlog 中,那么生产者发送的消息就不会丢失。

Broker 端的后台服务线程会不停地分发请求并异步构建 consumequeue(消费文件)和 indexFile(索引文件)。

2 数据文件

RocketMQ 的消息数据都会写入到数据文件中, 我们称之为 commitlog 。

所有的消息都会顺序写入数据文件,当文件写满了,会写入下一个文件。

RocketMQ的存储模型怎么掌握

如上图所示,单个文件大小默认 1G , 文件名长度为 20 位,左边补零,剩余为起始偏移量,比如 00000000000000000000 代表了第一个文件,起始偏移量为 0 ,文件大小为1 G = 1073741824。

当第一个文件写满了,第二个文件为 00000000001073741824,起始偏移量为 1073741824,以此类推。

RocketMQ的存储模型怎么掌握

从上图中,我们可以看到消息是一条一条写入到文件,每条消息的格式是固定的。

这样设计有三点优势:

  • 顺序写

磁盘的存取速度相对内存来讲并不快,一次磁盘 io 的耗时主要取决于:寻道时间和盘片旋转时间,提高磁盘 IO 性能最有效的方法就是:减少随机 IO,增加顺序 IO 。

RocketMQ的存储模型怎么掌握

《 The Pathologies of Big Data 》这篇文章指出:内存随机读写的速度远远低于磁盘顺序读写的速度。磁盘顺序写入速度可以达到几百兆/s,而随机写入速度只有几百 KB /s,相差上千倍。

  • 快速定位

因为消息是一条一条写入到 commitlog 文件 ,写入完成后,我们可以得到这条消息的物理偏移量。

每条消息的物理偏移量是唯一的, commitlog 文件名是递增的,可以根据消息的物理偏移量通过二分查找,定位消息位于那个文件中,并获取到消息实体数据。

  • 通过消息 offsetMsgId 查询消息数据

RocketMQ的存储模型怎么掌握

消息 offsetMsgId 是由 Broker 服务端在写入消息时生成的 ,该消息包含两个部分:

  • Broker 服务端 ip + port 8个字节;

  • commitlog 物理偏移量 8个字节 。

我们可以通过消息 offsetMsgId ,定位到 Broker 的 ip 地址 + 端口 ,传递物理偏移量参数 ,即可定位该消息实体数据。

3 消费文件

在介绍 consumequeue 文件之前, 我们先温习下消息队列的传输模型-发布订阅模型 , 这也是 RocketMQ 当前的传输模型。

RocketMQ的存储模型怎么掌握

发布订阅模型具有如下特点:

  • 消费独立:相比队列模型的匿名消费方式,发布订阅模型中消费方都会具备的身份,一般叫做订阅组(订阅关系),不同订阅组之间相互独立不会相互影响。

  • 一对多通信:基于独立身份的设计,同一个主题内的消息可以被多个订阅组处理,每个订阅组都可以拿到全量消息。因此发布订阅模型可以实现一对多通信。

因此,rocketmq 的文件设计必须满足发布订阅模型的需求。

那么仅仅 commitlog 文件是否可以满足需求吗 ?

假如有一个 consumerGroup 消费者,订阅主题 my-Mac-topic ,因为 commitlog 包含所有的消息数据,查询该主题下的消息数据,需要遍历数据文件 commitlog , 这样的效率是极其低下的。

进入 rocketmq 存储目录,显示见下图:

RocketMQ的存储模型怎么掌握

  • 消费文件按照主题存储,每个主题下有不同的队列,图中 my-mac-topic 有 16 个队列 ;

  • 每个队列目录下 ,存储 consumequeue 文件,每个 consumequeue 文件也是顺序写入,数据格式见下图。

RocketMQ的存储模型怎么掌握

每个 consumequeue 包含 30 万个条目,每个条目大小是 20 个字节,每个文件的大小是 30 万 * 20 = 60万字节,每个文件大小约5.72M 。和 commitlog 文件类似,consumequeue 文件的名称也是以偏移量来命名的,可以通过消息的逻辑偏移量定位消息位于哪一个文件里。

消费文件按照主题-队列来保存 ,这种方式特别适配发布订阅模型。

消费者从 broker 获取订阅消息数据时,不用遍历整个 commitlog 文件,只需要根据逻辑偏移量从 consumequeue 文件查询消息偏移量 , 最后通过定位到 commitlog 文件, 获取真正的消息数据。

这样就可以简化消费查询逻辑,同时因为同一主题下,消费者可以订阅不同的队列或者 tag ,同时提高了系统的可扩展性。

4 索引文件

每个消息在业务层面的唯一标识码要设置到 keys 字段,方便将来定位消息丢失问题。服务器会为每个消息创建索引(哈希索引),应用可以通过 topic、key 来查询这条消息内容,以及消息被谁消费。

由于是哈希索引,请务必保证key尽可能唯一,这样可以避免潜在的哈希冲突。

//订单Id   String orderId = "1234567890";   message.seTKEys(orderId);

开源的控制台中根据主题和 key 查询消息列表:

RocketMQ的存储模型怎么掌握

进入索引文件目录 ,如下图所以:

RocketMQ的存储模型怎么掌握

索引文件名 fileName 是以创建时的时间戳命名的,固定的单个 IndexFile 文件大小约为 400 M 。

IndexFile 的文件逻辑结构类似于 jdkHashMap数组链表结构。

RocketMQ的存储模型怎么掌握

索引文件主要由 Header、Slot Table (默认 500 万个条目)、Index Linked List(默认最多包含 2000万个条目)三部分组成 。

RocketMQ的存储模型怎么掌握

假如订单系统发送两条消息 A 和 B , 他们的 key 都是 "1234567890" ,我们依次存储消息 A , 消息 B 。

因为这两个消息的 key 的 hash 值相同,它们对应的哈希槽(深黄色)也会相同,哈希槽会保存的最新的消息 B 的索引条目序号 , 序号值是 4 ,也就是第二个深绿色条目。

而消息 B 的索引条目信息的最后 4 个字节会保存上一条消息对应的索引条目序号,索引序号值是 3 , 也就是消息 A 。

到此,相信大家对“RocketMQ的存储模型怎么掌握”有了更深的了解,不妨来实际操作一番吧!这里是编程网网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

--结束END--

本文标题: RocketMQ的存储模型怎么掌握

本文链接: https://www.lsjlt.com/news/347798.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • RocketMQ的存储模型怎么掌握
    本篇内容主要讲解“RocketMQ的存储模型怎么掌握”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“RocketMQ的存储模型怎么掌握”吧!RocketMQ简介RocketMQ有Producer、...
    99+
    2023-07-04
  • 一文彻底掌握RocketMQ的存储模型
    目录RocketMQ简介1 整体概览2 数据文件3 消费文件4 索引文件5 写到最后RocketMQ简介 RocketMQ有Producer、Consumer、NameSrv、Bro...
    99+
    2022-12-31
    RocketMQ 存储模型 RocketMQ 存储
  • PHP数据类型存储教程:掌握正确的方法!
    PHP是一种广泛使用的编程语言,它具有强大的数据类型存储功能。在PHP中,数据类型存储是非常重要的,因为它直接关系到程序的正确性和性能。本文将教你如何掌握正确的PHP数据类型存储方法。 一、PHP基本数据类型 PHP有8种基本数据类型,它们...
    99+
    2023-10-16
    数据类型 存储 教程
  • 怎么掌握Java的单例模式
    这篇“怎么掌握Java的单例模式”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么掌握Java的单例模式”文章吧。单例模式:...
    99+
    2023-06-30
  • 掌握mysql存储引擎以及数据类型的一些知识
    本文主要给大家介绍掌握mysql存储引擎以及数据类型的一些知识,文章内容都是笔者用心摘选和编辑的,具有一定的针对性,对大家的参考意义还是比较大的,下面跟笔者一起了解下掌握mysql存储引擎以及数据类型的一些...
    99+
    2022-10-18
  • SAP CRM Survey调查问卷的存储模型是怎样的
    本篇文章给大家分享的是有关SAP CRM Survey调查问卷的存储模型是怎样的,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。数据库表CRM_SVY_DB_SVS,通过如下的函...
    99+
    2023-06-04
  • 怎么理解并掌握的Go高级并发模式计时器
    这篇文章主要讲解了“怎么理解并掌握的Go高级并发模式计时器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解并掌握的Go高级并发模式计时器”吧!前言如果...
    99+
    2022-10-19
  • MySQL怎么存储无模式的数据
    MySQL是关系型数据库管理系统,不支持直接存储无模式的数据。无模式的数据通常指的是非结构化或半结构化数据,例如文本文件、图像、音频...
    99+
    2023-08-23
    MySQL
  • php怎么改变变量的存储类型
    PHP是一门广泛应用于Web开发的编程语言,它的灵活性和可扩展性让开发者们能够轻松地构建各种类型的应用。在PHP中,变量存储类型的选择很重要,因为它在很大程度上影响了代码的性能和可读性。本文将介绍如何在PHP中改变变量存储类型的方法,以及它...
    99+
    2023-05-14
    php
  • 怎么浅谈Java并发编程中的Java内存模型
    这篇文章的内容主要围绕怎么浅谈Java并发编程中的Java内存模型进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!物理计算机并发问题在介绍Java内存...
    99+
    2023-06-17
  • 怎么在Linux上检查MySQL数据表的存储引擎类型
    这篇文章的内容主要围绕怎么在Linux上检查MySQL数据表的存储引擎类型进行讲述,文章内容清晰易懂,条理清晰,非常适合新手学习,值得大家去阅读。感兴趣的朋友可以跟随小编一起阅读吧。希望大家通过这篇文章有所收获!MySQl主要使用两种存储引...
    99+
    2023-06-28
  • C#怎么获取任何机器上int类型的存储尺寸
    这篇文章主要介绍“C#怎么获取任何机器上int类型的存储尺寸”,在日常操作中,相信很多人在C#怎么获取任何机器上int类型的存储尺寸问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C#怎么获取任何机器上int类...
    99+
    2023-06-17
  • golang怎么用type-switch判断interface变量的实际存储类型
    这篇文章主要讲解了“golang怎么用type-switch判断interface变量的实际存储类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“golang怎么用type-switch判断...
    99+
    2023-06-30
  • 计算机中字符型数据在内存中存储形式是怎么样的
    这篇文章将为大家详细讲解有关计算机中字符型数据在内存中存储形式是怎么样的,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。字符型数据在内存中的存储形式是ASCII码。字符型数据是将一个字符常量放到一个字符变量...
    99+
    2023-06-15
  • web开发中怎么计算模型以及中间变量的显存占用大小
    这篇文章主要介绍web开发中怎么计算模型以及中间变量的显存占用大小,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!前言torch.FatalError: cuda ...
    99+
    2022-10-19
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作