RocketMQ(五)——工作原理
消息的生产
消息的生产过程
Producer可以将消息写入到某Broker中的某Queue中,经历了如下过程:
- Producer发送消息之前,会先向Name Server发出获取Topic的路由信息的请求
- Name Server返回该Topic的路由表及Broker列表
- Producer根据代码中指定的Queue选择策略,从Queue列表中选出一个队列,用于后续存储消息
- Producer对消息做一些特殊处理,例如:消息超过4M,会对其进行压缩
- 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后经历了以下几个过程才最终被持久化。
Broker根据queueId,获取到该消息对应索引条目要在consumequeue目录中的写入偏移量,即QueueOffset
将queueId、queueOffset等数据,与消息一起封装为消息单元
将消息单元写入到commitlog,同时,形成消息索引条目
将消息索引条目分发到相应的consumequeue
消息获取
当Consumer来拉取消息时会经历以下几个步骤
- Consumer获取到其要消费消息所在Queue的消费偏移量offset,计算出其要消费消息的消息offset
- Consumer向Broker发送拉取请求,其中会包含其要拉取消息的Queue、消息offset及消息Tag。
- Broker计算在该consumequeue中的queueOffset。
- 从该queueOffset处开始向后查找第一个指定Tag的索引条目
- 解析该索引条目的前8个字节,即可定位到该消息在commitlog中的commitlog offset
- 从对应commitlog offset中读取消息单元,并发送给Consumer
性能提升
- RocketMQ对文件的操作是通过mmap零拷贝实现的,对文件的操作转化为对内存地址的直接操作,极大提高了读写效率
- consumequeue中的文件是顺序存放的,硬盘顺序读写速度要高于随机读写。并且还引入了PageCache页缓存机制,使得对consumequeue的读取几乎接近内存读取速度。
RocketMQ(五)——工作原理相关推荐
- rocketMQ —— 02(集群搭建、rocketmq工作原理)
目录标题 一.相关推荐 二.基本架构图: 三.集群模式 1.单Master模式(这种单节点的理论上不叫集群) 2.多Master模式 3.多Master多Slave模式(异步) 4.多Master多S ...
- Android系统Recovery工作原理之使用update.zip升级过程分析(五)
Android系统Recovery工作原理之使用update.zip升级过程分析(五)---update.zip包从上层进入Recovery服务文章开头我们就提到update.zip包来源有两种,一个 ...
- 五分钟,带你彻底掌握 MyBatis缓存 工作原理
作者:双子孤狼 blog.csdn.net/zwx900102/article/details/108696005 前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的 ...
- mybatis 二级缓存失效_给我五分钟,带你彻底掌握MyBatis的缓存工作原理
前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的缓存,各种中间件如Redis也是用来充当缓存的作用,编程语言中又可以利用内存来作为缓存.自然的,作为一款优秀的ORM ...
- 给我五分钟,带你彻底掌握 MyBatis 缓存的工作原理
前言 在计算机的世界中,缓存无处不在,操作系统有操作系统的缓存,数据库也会有数据库的缓存,各种中间件如Redis也是用来充当缓存的作用,编程语言中又可以利用内存来作为缓存.自然的,作为一款优秀的ORM ...
- 步进电机定子相数:单相/两相/三相/四相/五相结构工作原理
步进电机定子相数:单相/两相/三相/四相/五相结构工作原理 文章目录 决定步距角的因素 单相步进电机 两相步进电机 三相步进电机 四相步进电机 五相步进电机 相数与特性:分辨率.振动.转速 当步进电机 ...
- 2016鄂教版小学信息技术初识计算机软件,鄂教版(2016)五年级全册信息技术 25.揭秘计算机工作世界--初识计算机工作原理 教案...
鄂教版(2016)五年级全册信息技术 25.揭秘计算机工作世界--初识计算机工作原理 教案 揭秘计算机工作原理 --初始计算机工作世界 [教材分析] 本节课是鄂教版信息技术教材五年级第七单元的第一课, ...
- 充电器充满变灯电路图(五款充电器充满变灯指示电路详细)一般充电器的工作原理是稳压限流。根据检测到的充电电流变化来实现红转绿的,不同容量的蓄电池所要设定转灯的电流值不同
充电器充满变灯电路图(一) 电路原理图: 输入直流电压高于所充电池电压3伏即可.R1.Q1.W1.TL431组成精密可调稳压电路,Q2.W2.R2构成可调恒流电路,Q3.R3.R4.R ...
- 第五章 路由器的工作原理及其配置
第五章 路由器的工作原理及其配置 5.1 广域网服务 WAN连接的目的是在两个远离的网络之间尽可能高效率传递数据.连接的效率越高,到最终用户的连接就越透明.WAN连接通常比L A N连接要慢.例如,一 ...
- html图片查看器工作原理,五分钟了解浏览器的工作原理
Web 浏览器无疑是用户访问互联网最常见的入口.浏览器凭借其免安装和跨平台等优势,逐渐取代了很多传统的富客户端. Web 浏览器通过向 URL 发送网络请求来访问 Web 服务器资源,并以交互性的方式 ...
最新文章
- “可扩展标记语言”(XML) 提供一种描述结构化数据的方法。
- AutoX“真无人”车队驶上繁忙街头,中国正式进无人驾驶时代
- Oculus为VR视频发明了新时间单位「flick」
- qmake, makefile, make是什么东东,makefile简介!
- idea新建maven项目没有src目录
- Spring Boot和Angular 2入门食谱
- oracle -12169,很奇怪的错误ORA-12169
- 【重磅资料】ArchSummit全球架构师峰会·2019华为云技术专场资料下载
- 迟思堂工作室编程规范:单片机C语言
- 网络营销之百度营销技巧(一) 百度知道推广日常手册
- 通配符 或 怎么浓_浓咖啡的咖啡渣新鲜度
- OneZero——Review会议(2013.5.20)
- 输出纹波和纹波电流测试规范分享
- eclipse中的servers不见了解决方法
- Google Play APK 下载
- java开发 与c sharp 开发思想_Java与CSharp的相同与不同
- 能提取HTML网页正文的网站,智能提取网页正文新方法
- 群联PS3111+7DDL+JMS578转接板,开卡pSLC,附PS3111量产工具
- 简单描述一下redux-thunk的个人理解
- Ubuntu16.04安装cello
热门文章
- Spring Boot项目实战:BBT版西蒙购物网
- 二级VB培训笔记06:窗体与常用控件综合案例【个人信息注册】
- 【BZOJ3295】动态逆序对,CDQ分治/BIT套权值线段树
- 【codevs1582】【BZOJ1228】E和D,博弈
- gulp临时服务器显示html页面,用Gulp实现CSS压缩和页面自动刷新
- 2017.8.9 老C的键盘 思考记录
- 设置相机的距离_数码相机的曝光判断标准是什么
- 华为数据之道_数字化与数据治理的典范实践者 | 华为数据之道
- 谷歌为什登不上去github_安卓开源是假的,谷歌随时禁用,华为手机在海外市场已经快跌没了...
- linux 内存泄露检测工具——valgrind