消息的生产

消息的生产过程

Producer可以将消息写入到某Broker中的某Queue中,经历了如下过程:

  1. Producer发送消息之前,会先向Name Server发出获取Topic的路由信息的请求
  2. Name Server返回该Topic的路由表及Broker列表
  3. Producer根据代码中指定的Queue选择策略,从Queue列表中选出一个队列,用于后续存储消息
  4. Producer对消息做一些特殊处理,例如:消息超过4M,会对其进行压缩
  5. Producer向选出的Queue所在Broker发出消息RPC请求,将消息发送到选择出的Queue
  • 路由表:实际是一个Map,key是topic名称,value是一个Queue Data实例列表。Queue Data并不是一个Queue对应一个Queue Data,而是一个Broker中该Topic所有的Queue对应一个Queue Data。即只要是涉及到该Topic的Broker,一个Broker中该Topic的所有Queue对应一个Queue Data。Queue Data中包含Broker Name。简单来说,路由表的Key为Topic名称,value则为所有涉及该Topic的Broker Name 列表。
  • Broker 列表:实际也是Map。Key为broker name,value为Broker Data 。一套Broker Name 名称相同的Master-Slave集群对应一个Broker Data,Broker Data中包含Broker Name及一个map。该map的key为BrokerID,value为该Broker对应的地址。brokerID为0时表示该Broker 为Master。非0表示Slave

Queue算法

对于无序消息,其 Queue选择算法(消息投递算法),有两种较为常见方式:

轮询算法

默认选择该算法,该算法保证了每个Queue中都可以均匀获得消息

存在问题:

某些Broker上的Queue可能投递延迟较严重。从而导致 Producer的缓存队列中出现较大的消息积压,影响消息的投递性能。

最小投递延迟算法

该算法会统计每次消息投递的时间延迟,然后根据统计出的结果将消息投递到时间延迟最小的Queue。如果延迟相同,则采用轮询算法投递。该算法可以有效提升消息的投递性能。

存在问题:

消息在Queue上的分配不均匀。投递延迟小的Queue其可能会存在大量 的消息。而对该Queue的消费者压力会增大,降低消息的消费能力,可能会导致MQ中消息的堆积

消息的存储

RocketMQ中的消息存储在本地文件系统中,这些相关文件默认在当前用户主目录下的store目录中。

文件说明:

  • abort:该文件在Broker启动后会自动创建,正常关闭Broker,该文件会自动消失。若在没有启动
  • Broker的情况下,发现这个文件是存在的,则说明之前Broker的关闭是非正常关闭。
  • checkpoint:其中存储着commitlog、consumequeue、index文件的最后刷盘时间戳
  • commitlog:其中存放着commitlog文件,而消息是写在commitlog文件中的。注意:在源码中,该文件被命名为mappedFile
  • config:存放着Broker运行期间的一些配置数据
  • consumequeue:其中存放着consumequeue文件,队列就存放在这个目录中
  • index:其中存放着消息索引文件indexFile
  • lock:运行期间使用到的全局资源锁

Commitlog

  • 该目录中存放这很多mappedFile 文件,当前Broker中所有消息都是落盘到这些mappedFile文件中的。mappedFile文件大小为1G,文件名有20位十进制数构成,表示当前文件的第一条消息的起始位置偏移量。

  • 第一个文件名一定是20个0,即第一个文件的第一条消息的偏移量commitlog offset为0

  • 当第一个文件放满时,则会自动生成第二个文件继续存放消息。

  • 一个Broker中所有的mappedFile文件的commitlog offset是连续的

  • 一个Broker仅包含一个commit log目录,所有的mappedFile文件都是存放在该目录中的。也就是说,无论当前Broker中存放这多少Topic的消息,这些消息都被顺序写入到了mappedFile文件中的,这些消息在Broker中存放时并没有按照Topic进行分类存放。

消息单元

mappedFile文件内容由一个个消息单元构成,每个消息单元中包含 MsgLen(总长度),Physical Offset(物理位置),Body(消息体),BodyLength(消息体长度),Topic(主题),TopicLength(主题长度),Born Host(消息生产者),BornTimestamp(消息发送时间戳),QueueID(消息所在队列ID),QueueOffset(消息在Queue中存储的偏移量)等消息

consume queue

  • 为了提高效率,会为每个Topic在~/store/consumequeue中创建一个目录,目录名为Topic名称。在该Topic目录下,会再为每个该Topic的Queue建立一个目录,目录名为queueId。每个目录中存放着若干consumequeue文件,consumequeue文件是commitlog的索引文件,可以根据consumequeue定位到具体的消息。

  • consumequeue文件名也由20位数字构成,表示当前文件的第一个索引条目的起始位移偏移量。与mappedFile文件名不同的是,其后续文件名是固定的。因为consumequeue文件大小是固定不变的。

索引条目

  • 每个consumequeue文件可以包含30万个索引条目,每个索引条目包含了三个消息重要属性:消息在mappedFile文件中的偏移量CommitLog Offset、消息长度、消息Tag的hashcode值。这三个属性占20个字节,所以每个文件的大小是固定的30万 * 20字节。

  • 一个consumequeue文件中所有消息的Topic一定是相同的。但每条消息的Tag可能是不同的。

对文件的读写

消息写入

一条消息进入到Broker后经历了以下几个过程才最终被持久化。

  1. Broker根据queueId,获取到该消息对应索引条目要在consumequeue目录中的写入偏移量,即QueueOffset

  2. 将queueId、queueOffset等数据,与消息一起封装为消息单元

  3. 将消息单元写入到commitlog,同时,形成消息索引条目

  4. 将消息索引条目分发到相应的consumequeue

消息获取

当Consumer来拉取消息时会经历以下几个步骤

  1. Consumer获取到其要消费消息所在Queue的消费偏移量offset,计算出其要消费消息的消息offset
  2. Consumer向Broker发送拉取请求,其中会包含其要拉取消息的Queue、消息offset及消息Tag。
  3. Broker计算在该consumequeue中的queueOffset。
  4. 从该queueOffset处开始向后查找第一个指定Tag的索引条目
  5. 解析该索引条目的前8个字节,即可定位到该消息在commitlog中的commitlog offset
  6. 从对应commitlog offset中读取消息单元,并发送给Consumer

性能提升

  • RocketMQ对文件的操作是通过mmap零拷贝实现的,对文件的操作转化为对内存地址的直接操作,极大提高了读写效率
  • consumequeue中的文件是顺序存放的,硬盘顺序读写速度要高于随机读写。并且还引入了PageCache页缓存机制,使得对consumequeue的读取几乎接近内存读取速度。

RocketMQ(五)——工作原理相关推荐

  1. rocketMQ —— 02(集群搭建、rocketmq工作原理)

    目录标题 一.相关推荐 二.基本架构图: 三.集群模式 1.单Master模式(这种单节点的理论上不叫集群) 2.多Master模式 3.多Master多Slave模式(异步) 4.多Master多S ...

  2. Android系统Recovery工作原理之使用update.zip升级过程分析(五)

    Android系统Recovery工作原理之使用update.zip升级过程分析(五)---update.zip包从上层进入Recovery服务文章开头我们就提到update.zip包来源有两种,一个 ...

  3. 五分钟,带你彻底掌握 MyBatis缓存 工作原理

    作者:双子孤狼 blog.csdn.net/zwx900102/article/details/108696005 前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的 ...

  4. mybatis 二级缓存失效_给我五分钟,带你彻底掌握MyBatis的缓存工作原理

    前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的缓存,各种中间件如Redis也是用来充当缓存的作用,编程语言中又可以利用内存来作为缓存.自然的,作为一款优秀的ORM ...

  5. 给我五分钟,带你彻底掌握 MyBatis 缓存的工作原理

    前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的缓存,各种中间件如Redis也是用来充当缓存的作用,编程语言中又可以利用内存来作为缓存.自然的,作为一款优秀的ORM ...

  6. 步进电机定子相数:单相/两相/三相/四相/五相结构工作原理

    步进电机定子相数:单相/两相/三相/四相/五相结构工作原理 文章目录 决定步距角的因素 单相步进电机 两相步进电机 三相步进电机 四相步进电机 五相步进电机 相数与特性:分辨率.振动.转速 当步进电机 ...

  7. 2016鄂教版小学信息技术初识计算机软件,鄂教版(2016)五年级全册信息技术 25.揭秘计算机工作世界--初识计算机工作原理 教案...

    鄂教版(2016)五年级全册信息技术 25.揭秘计算机工作世界--初识计算机工作原理 教案 揭秘计算机工作原理 --初始计算机工作世界 [教材分析] 本节课是鄂教版信息技术教材五年级第七单元的第一课, ...

  8. 充电器充满变灯电路图(五款充电器充满变灯指示电路详细)一般充电器的工作原理是稳压限流。根据检测到的充电电流变化来实现红转绿的,不同容量的蓄电池所要设定转灯的电流值不同

    充电器充满变灯电路图(一)         电路原理图: 输入直流电压高于所充电池电压3伏即可.R1.Q1.W1.TL431组成精密可调稳压电路,Q2.W2.R2构成可调恒流电路,Q3.R3.R4.R ...

  9. 第五章 路由器的工作原理及其配置

    第五章 路由器的工作原理及其配置 5.1 广域网服务 WAN连接的目的是在两个远离的网络之间尽可能高效率传递数据.连接的效率越高,到最终用户的连接就越透明.WAN连接通常比L A N连接要慢.例如,一 ...

  10. html图片查看器工作原理,五分钟了解浏览器的工作原理

    Web 浏览器无疑是用户访问互联网最常见的入口.浏览器凭借其免安装和跨平台等优势,逐渐取代了很多传统的富客户端. Web 浏览器通过向 URL 发送网络请求来访问 Web 服务器资源,并以交互性的方式 ...

最新文章

  1. “可扩展标记语言”(XML) 提供一种描述结构化数据的方法。
  2. AutoX“真无人”车队驶上繁忙街头,中国正式进无人驾驶时代
  3. Oculus为VR视频发明了新时间单位「flick」
  4. qmake, makefile, make是什么东东,makefile简介!
  5. idea新建maven项目没有src目录
  6. Spring Boot和Angular 2入门食谱
  7. oracle -12169,很奇怪的错误ORA-12169
  8. 【重磅资料】ArchSummit全球架构师峰会·2019华为云技术专场资料下载
  9. 迟思堂工作室编程规范:单片机C语言
  10. 网络营销之百度营销技巧(一) 百度知道推广日常手册
  11. 通配符 或 怎么浓_浓咖啡的咖啡渣新鲜度
  12. OneZero——Review会议(2013.5.20)
  13. 输出纹波和纹波电流测试规范分享
  14. eclipse中的servers不见了解决方法
  15. Google Play APK 下载
  16. java开发 与c sharp 开发思想_Java与CSharp的相同与不同
  17. 能提取HTML网页正文的网站,智能提取网页正文新方法
  18. 群联PS3111+7DDL+JMS578转接板,开卡pSLC,附PS3111量产工具
  19. 简单描述一下redux-thunk的个人理解
  20. Ubuntu16.04安装cello

热门文章

  1. Spring Boot项目实战:BBT版西蒙购物网
  2. 二级VB培训笔记06:窗体与常用控件综合案例【个人信息注册】
  3. 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树
  4. 【codevs1582】【BZOJ1228】E和D,博弈
  5. gulp临时服务器显示html页面,用Gulp实现CSS压缩和页面自动刷新
  6. 2017.8.9 老C的键盘 思考记录
  7. 设置相机的距离_数码相机的曝光判断标准是什么
  8. 华为数据之道_数字化与数据治理的典范实践者 | 华为数据之道
  9. 谷歌为什登不上去github_安卓开源是假的,谷歌随时禁用,华为手机在海外市场已经快跌没了...
  10. linux 内存泄露检测工具——valgrind