RocketMQ的学习历程(5)----broker内部设计

这篇具有很好参考价值的文章主要介绍了RocketMQ的学习历程(5)----broker内部设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

概要

在首个学习历程中,我们已经了解了,RokctMQ简单的工作流程。

如果想要更深的理解RokcetMQ消息处理的流程,broker内部流程的理解是必要的,
这里我们就了解一下Broker内部的工作流程。

整体架构流程

RocketMQ的学习历程(5)----broker内部设计

当Consumer消费消息时,需要先读取ConsumeQueue得到offset,再通过offset找到CommitLog对应的消息内容。

技术名词解释

CommitLog和ConsumeQueue

  • CommitLog:CommitLog是RocketMQ中消息主体以及元数据的存储主体,存储Producer端写入的消息主体内容,消息内容不是定长的。
    1. 在RocketMQ中,所有topic的消息都存储在一个称为CommitLog的文件中,该文件默认最大为1GB,超过1GB后会轮到下一个CommitLog文件。

    2. CommitLog文件存储在${ROCKET_HOME}/store/commitlog目录下。

    3. 顺序写入,随机读写。

    4. 消息只要被写入 commitlog 那么该消息就不会丢失

    5. 消息是非定长的

    6. 文件的命名是以 commitlog 起始偏移量命名的

  • ConsumeQueue:消息消费队列引入的目的主要是提高消息消费的性能。
    1. 由于RocketMQ是基于主题topic的订阅模式,消息消费是针对主题进行的,如果要遍历comitlag文件中根据topic检索消息是非常低效的。
    2. Consumer即可根据ConsumeQueue来查找待消费的消息。其ConsumeQueue(逻辑消费队列)作为消费消息的索引,保存了指定Topic下的队列消息在CommiL og中的起始物理偏移量ofiset,消息大小size和消息JTag的HashCode值。consumequeue文件可以看成是基于topic的commitlog索引文件
    3. 故consumequeue文件夹的组织方式如下: topic/queue/file三层组织结构,具体存储路为:$HOMEistorelconsumequeve(topiclqLeuel)ifieName)。
    4. 同样consumequecue文件采取定长设计,每一个条目共20个字节,分别为8字节的comitlog物理偏移量、4字节的消息长度、8字节tag hashcode,单个文件由30W个条目组成,可以像数组一样随机访问每一个条目,每个ConsumeQueue文件大小约5.72M;

页缓存和内存映射

  • 页缓存和内存映射页缓存(PageCache)是OS对文件的缓存,用于加速对文件的读写,内存映射是指将文件映射到进程的地址空间,使得应用程序可以像访问内存一样访问文件
    1. RocketMQ使用了内存映射文件的办法,将一个文件映射到进程的地址空间,实现文件的磁盘地址和进程的一段虚拟地址关联,实际上是利用了NIO 中的 FileChannel 模型。RocketMQ通过使用内存映射文件来提高IO访问性能,无论是CommitLog、 ConsumeQueue还是IndexFile,单个文件都被设计为固定长度,如果一个文件写满以后再创建一个新文件,文件名就为该文件第一条消息对应的全局物理偏移量。

    2. RocketMQ中的页缓存和内存映射都是文件系统中的缓存机制。RocketMQ单独创建一个MappedByteBuffer内存缓存池,用来临时存储数据,数据先写入该内存映射中,然后由commit线程定时将数据从该内存复制到与目的物理文件对应的内存映射中。

刷盘机制

RocketMQ提供了同步和异步两种刷盘方式
RocketMQ的学习历程(5)----broker内部设计

  1. 同步刷盘方式能够保证数据被写入硬盘,做到真正的持久化,但是也会让系统的写入速度受制于磁盘的IO速度;
  2. 而异步刷盘方式在将数据写入缓冲之后就返回,提供了系统的IO速度,却存在系统发生故障时未来得及写入硬盘的数据丢失的风险。

小结

本节我们简单了解了broker内部的简单流程知识,期待一起进步。文章来源地址https://www.toymoban.com/news/detail-471991.html

到了这里,关于RocketMQ的学习历程(5)----broker内部设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RocketMq 源码解读-Broker(1)

    这边源码分支为release-4.2.0 处理拉取信息请求 通过broker模块下面的processor目录下, 我们找到 org.apache.rocketmq.broker.processor.PullMessageProcessor 这个类的 processRequest 方法.这边就不省略代码了, 只是在重要的部分加上注释, 供参阅 其中, 有一行代码为 找到getMessage的实现类 package org.

    2024年02月09日
    浏览(37)
  • RocketMQ源码阅读-Broker消息接收

    Broker接收 Producer 发送的消息。 Broker在RocketMQ中也是一个独立的Model,rocketmq-broker。 Broker的核心类为SendMessageProcessor。 同样从单元测试入手,看Broker接收消息的流程。 SendMessageProcessor的单元测试类为org.apache.rocketmq.broker.processor.SendMessageProcessorTest。 包含上面这些方法,其中ini

    2024年01月17日
    浏览(33)
  • [RocketMQ] Broker启动流程源码解析 (二)

    1.Brocker介绍 Broker主要负责消息的存储、投递和查询以及服务高可用保证, Broker包含了以下几个重要子模块。 Remoting Module: 整个Broker的实体, 负责处理来自Client端的请求 Client Manager: 负责管理客户端 Producer和Consumer, 维护Consumer的Topic订阅信息 Store Service: 提供方便简单的API接口处理

    2024年02月09日
    浏览(53)
  • 38.RocketMQ之Broker的主从架构

    本文摘自:Broker的主从架构是怎么实现的 Broker是RocketMQ的核心模块,负责接收并存储消息,为了保证整个MQ的高可用,一般情况都会将Broker部署成集群,集群中的每一部分都由Master和Slave组成,那么Master与Slave之间的数据是如何保证同步一致的呢? 是Master主动把数据推送给Slav

    2024年02月13日
    浏览(47)
  • RocketMQ主从集群broker无法启动,日志报错

    使用vmWare安装的centOS7.9虚拟机,RocketMQ5.1.3 在rocketMQ的bin目录里使用相对路径的方式启动broker,jps查询显示没有启动,日志报错如下 排查配置文件没有问题,nameServer也已经正常启动 更换绝对路径,启动broker,就可以正常启动  

    2024年02月16日
    浏览(47)
  • [RocketMQ] Broker asyncSendMessage处理消息以及自动创建Topic (十)

    asyncSendMessage方法用来处理来自producer发送的消息。 1.asyncSendMessage异步处理单条消息 调用preSend方法创建响应的命令对象, 包括自动创建topic的逻辑, 随后创建响应头对象。 随后创建MessageExtBrokerInner对象, 从请求中获取消息的属性并设置到对象属性中, 消息体, topic。 判断如果是重

    2024年02月12日
    浏览(35)
  • [RocketMQ] Broker CommitLogDispatcher 异步构建ConsumeQueue和IndexFile源码解析 (十四)

    CommitLogDispatcherBuildConsumeQueue: 异步构建ConsumerQueue。 CommitLogDispatcherBuildIndex: 异步构建IndexFile。 1.CommitLogDispatcherBuildConsumeQueue构建ConsumeQueue CommitLogDispatcherBuildConsumeQueue用于接收分发请求并构建ConsumeQueue。 对于非事务消息或者是事务commit消息, 调用DefaultMessageStore#putMessagePositionI

    2024年02月17日
    浏览(42)
  • Django框架入门到精通(01)Django概要 (黄菊华老师大学生毕业设计学习教程)

    博主介绍 :《Vue.js入门与商城开发实战》《微信小程序商城开发》图书作者,CSDN博客专家,在线教育专家,CSDN钻石讲师;专注大学生毕业设计教育和辅导。 所有项目都配有从入门到精通的基础知识视频课程,免费 项目配有对应开发文档、开题报告、任务书、PPT、论文模版

    2024年02月08日
    浏览(43)
  • RocketMQ如何实现消息轨迹:消息何时发送的?耗时多久?谁消费的?存在哪个broker了?

    更多RocketMQ内容,见专栏:https://blog.csdn.net/saintmm/category_11280399.html 消息轨迹简单来说就是日志,其把消息的生产、存储、消费等所有的访问和操作日志。 在项目中存在发送方与消费方相互“扯皮”的情况: 发送方说消息已经发送成功,而消费方说没有消费到。 这时我们就希

    2024年01月17日
    浏览(52)
  • [架构之路-263]:目标系统 - 设计方法 - 软件工程 - 软件设计 - 概要设计 - 综述、如何做概要设计、概要设计的内容

    目录 一、概要设计综述 1.1 什么是概要设计 1.2 概要设计的目标 1.3 软件概要设计与软件架构设计的比较 1.4 软件概要设计、软件架构、软件详细设计比较 二、如何做好概要设计 2.1 概要设计的入手点 2.2 概要设计的步骤 2.3 进行概要设计的注意事项 三、软件概要设计的内容

    2024年03月10日
    浏览(89)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包