在RocketMQ中,消息存储是由CommitLog和ConsumerQueue配合完成

消息存储结构

首先我们先来看下整体的消息存储结构

基本过程:

  1. 生产者在生产消息的时候是将消息存储在CommitLog文件中
  2. 消费者在读取消息时,先读取 ConsumeQueue,然后再通过ConsumeQueue中的位置信息读取CommitLog文件中具体的消息数据得到原始消息。

这里有两个需要注意的地方,CommitLogConsumeQueue结构

CommitLog

可以理解这个其实就是一个日志文件,该文件默认最大为1GB,超过1GB后会轮到下一个CommitLog文件进行存储。通过CommitLog,RocketMQ将所有消息都进行顺序存储,充分利用了磁盘顺序写提高数据存储性能

  • 4字节表示消息的长度,消息的长度是整个消息体所占用的字节数的大小
  • 4字节的魔数,是固定值,有MESSAGE_MAGIC_CODE和BLANK_MAGIC_CODE
  • 4字节的CRC,是消息体的校验码,用于防止网络、硬件等故障导致数据与发送时不一样带来的问题 - 4字节的queueId,表示消息发到了哪个MessageQueue(逻辑上相当于kakka的partition)
  • 4字节的flag,flag是创建Message对象时由生产者通过构造器设定的flag值
  • 8字节的queueOffset,表示在queue中的偏移量
  • 8字节的physicalPosition,表示在存储文件中的偏移量
  • 4字节sysFlag,是生产者相关的信息标识,具体生产逻辑可以看相关代码
  • 8字节消息创建时间
  • 8字节消息生产者的host
  • 8字节消息存储时间
  • 8字节消息存储的机器的host
  • 4字节表示重复消费次数
  • 8字节消息事务相关偏移量
  • 4字节表示消息体的长度消息休,不是固定长度,和前面的4字节的消息体长度值相等
  • 1字节表示topic的长度,因此topc的长度最多不能超过127个字节,超过的话存储会出错(有前置校验)
  • Topic,存储topic,因为topic不是固定长度,所以这里所占的字节是不固定的,和前一个表示topic长度的字节的值相等
  • 2字节properties的长度,properties是创建消息时添加到消息中的,因此,添加在消息中的poperties不能太多太大,所有的properties的kv对在拼接成string后,所占的字节数不能超过2^15-1
  • Properties的内容,也不是固定长度,和前面的2字节properties长度的值相同

ConsumeQueue

  • Offset:表示在默认1GB的CommitLog文件中的偏移量(位置)
  • Size:表示消息占用的长度
  • tagCode:消息所属的tag的hash值

可以看到一个消息的数据包占用共20个字节,RocketMQ在消息存储上并没有存储具体的消息,而是将具体消息数据存储在CommitLog文件中,这也是和Kafka很大的一个不同点(Kafka中是存储具体消息数据的)

总结

RocketMQ这样的消息存储结构它的优势是什么,接下来我们通过与Kafka对比来看下

  1. 写顺序不同:RocketMQ 将所有消息存储在同一个CommitLog中,使得RocketMQ中的消息是磁盘顺序写,顺序IO可以接近内存的速度。而Kafka中在消息存储上是随机IO,随机IO要比顺序IO慢得多
  2. 消息数据存储方式不同:RocketMQ中每个消息仅存储20字节的消息位置信息(原始数据存在CommitLog),而Kafka将每个partition的消息分开存储,因此在单个Broker中RocketMQ能支持更多的topic、partition
  3. 消息数据大小不同:在RocketMQ中,ConsumeQueue也是随机IO,但确能比Kafka支持更多的partition,原因是RocketMQ通过MappedFile的方式读写ConsumeQueue,操作系统对内存映射文件有page cache,且一个消息位置数据仅有20字节,一个page中可以包含很多的消息数据,相当于直接对内存随机IO,所以效率要比Kafka高出得多

RocketMQ消息存储结构分析及相对于Kafka的优势相关推荐

  1. rocketmq消息存储原理_RocketMQ到底快在哪里?深入探索RocketMQ消息存储和查询原理...

    RocketMQ 作为一款优秀的分布式消息中间件,可以为业务方提供高性能低延迟的稳定可靠的消息服务.其核心优势是可靠的消费存储.消息发送的高性能和低延迟.强大的消息堆积能力和消息处理能力. 从存储方式 ...

  2. XML具有哪些特点?相对于HTML的优势

    xml具有哪些特点?相对于html的优势? 1什么是html html被称为超文本标记语言, 是一种描述性语言,用html 可以创建能在互联网上传输的信息页,是构成网页文档的主要语言,它是由很多的标签 ...

  3. 详解: Spark 相对于MapReduce的优势(为什么MapReduce性能不理想)

    Spark相对于MapReduce的优势 一:MapReduce存在的问题 1**. MapReduce框架局限性** 1)仅支持Map和Reduce两种操作 2)处理效率低效. a)Map中间结果写 ...

  4. Kafka的优势有哪些?经常应用在哪些场景?

    Kafka的优势有哪些?经常应用在哪些场景? Kafka的优势比较多如多生产者无缝地支持多个生产者.多消费者.基于磁盘的数据存储.具有伸缩性.高性能轻松处理巨大的消息流.多用于开发消息系统,网站活动追 ...

  5. RocketMQ消息存储的整体结构

    RocketMQ的消息存储采用的是混合型的存储结构,也就是Broker单个实例下的所有队列公用一个日志数据文件CommitLog.这个是和Kafka又一个不同之处. 为什么不采用kafka的设计,针对 ...

  6. RocketMQ消息存储、刷盘、负载均衡

    消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分. 消息存储总体架构 消息存储架构图: minOffset:当前队列的最小消息偏移量,如果消费时指定从最早消费,就是从该偏移量消费. m ...

  7. RocketMQ消息存储之刷盘机制(原理篇)

    一.前言 RocketMQ的刷盘机制是一种确保消息可靠性的机制,简单来说就是Broker收到消息后,将消息存储到磁盘上.这样可以解决几个问题: 存储空间问题.内存空间有限,存入磁盘可以维护更多消息. ...

  8. RocketMQ消息存储原理

    消息存储 CommitLog 1.消息内容和元数据都会存在CommitLog日志文件中2.消息内容不是定长的3.单个文件大小默认1G 文件名长度为20位 左边补零 剩余为起始偏移量 比如第一个文件名是 ...

  9. rocketmq存储消息mysql_再说rocketmq消息存储

    两篇精彩的文章: rocketmq通过netty获取到消息请求后,直接掉处理模块,比如:SendMessageProcessor 这个处理类主要负责处理客户端发送消息的请求. 这个类实现了com.al ...

最新文章

  1. 5m 云服务器2核4g_华为云服务器2核4G 5M 248一年
  2. webpack-插件机制杂记
  3. 8.STM32中对ADC1_Config()函数(ADC1_GPIO_Config()和ADC1_Mode_Config())的理解(自定义)测试ADC转换电压值输出到终端上。
  4. JVM - Class常量池 || 运行时常量池
  5. Linux使用RSA实现免密登录(原理)
  6. /etc/fstab 参数详解及如何设置开机自动挂载
  7. Excel2003怎样拆分单元格
  8. 蓝桥杯 ALGO-29 算法训练 校门外的树(区间处理)
  9. 5.企业安全建设入门(基于开源软件打造企业网络安全) --- 业务安全
  10. 解决支持双面打印的打印机不能双面打印PDF
  11. SQLSERVER - 资源池 ‘internal‘ 没有足够的系统内存来运行此查询。
  12. java经典错误语句_【Java】Java代码经典错误清单
  13. QT绘图实现橡皮擦效果
  14. javac的命令(-Xbootclasspath、-classpath与-sourcepath等)
  15. Python系列 之 email模块 - 发送邮件
  16. python中列表的元素是什么数据类型_python基本数据类型之列表和元组(一)
  17. FCS20222-06-File Datebase
  18. java temporary_临时表temporary table
  19. [原创]从 TWAIN 设备中扫描图像
  20. 10个强大的Python数据科学技巧

热门文章

  1. js并发上传文件到不同服务器,simple-uploader.js 功能强大的上传组件 - 文章教程
  2. 洛谷P1073 最优贸易
  3. cocos2d-x JS 重力感应监听事件
  4. 傲腾明年爆发 Intel霸占企业市场,成SSD真正赢家
  5. 俄罗斯调查PC厂商合谋操纵市场 联想被指妨碍调查
  6. 基于Promise对象的新一代Ajax API--fetch
  7. 创建永远隐藏的隐藏帐号
  8. 中文分词算法工具hanlp源码解析
  9. PyQt4(简单界面)
  10. 一个失败的创意:GPGPU纹理化通用加速kD树的实现