RocketMQ消息存储结构分析及相对于Kafka的优势
在RocketMQ中,消息存储是由CommitLog和ConsumerQueue配合完成
消息存储结构
首先我们先来看下整体的消息存储结构
基本过程:
- 生产者在生产消息的时候是将消息存储在
CommitLog
文件中 - 消费者在读取消息时,先读取 ConsumeQueue,然后再通过ConsumeQueue中的位置信息读取CommitLog文件中具体的消息数据得到原始消息。
这里有两个需要注意的地方,CommitLog
和ConsumeQueue
结构
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对比来看下
写顺序不同
:RocketMQ 将所有消息存储在同一个CommitLog中,使得RocketMQ中的消息是磁盘顺序写,顺序IO可以接近内存的速度。而Kafka中在消息存储上是随机IO,随机IO要比顺序IO慢得多- 消息数据存储方式不同:RocketMQ中每个消息仅存储20字节的消息位置信息(原始数据存在CommitLog),而Kafka将每个partition的消息分开存储,因此在单个Broker中RocketMQ能支持更多的topic、partition
消息数据大小不同
:在RocketMQ中,ConsumeQueue也是随机IO,但确能比Kafka支持更多的partition,原因是RocketMQ通过MappedFile
的方式读写ConsumeQueue,操作系统对内存映射文件有page cache,且一个消息位置数据仅有20字节,一个page中可以包含很多的消息数据,相当于直接对内存随机IO,所以效率要比Kafka高出得多
RocketMQ消息存储结构分析及相对于Kafka的优势相关推荐
- rocketmq消息存储原理_RocketMQ到底快在哪里?深入探索RocketMQ消息存储和查询原理...
RocketMQ 作为一款优秀的分布式消息中间件,可以为业务方提供高性能低延迟的稳定可靠的消息服务.其核心优势是可靠的消费存储.消息发送的高性能和低延迟.强大的消息堆积能力和消息处理能力. 从存储方式 ...
- XML具有哪些特点?相对于HTML的优势
xml具有哪些特点?相对于html的优势? 1什么是html html被称为超文本标记语言, 是一种描述性语言,用html 可以创建能在互联网上传输的信息页,是构成网页文档的主要语言,它是由很多的标签 ...
- 详解: Spark 相对于MapReduce的优势(为什么MapReduce性能不理想)
Spark相对于MapReduce的优势 一:MapReduce存在的问题 1**. MapReduce框架局限性** 1)仅支持Map和Reduce两种操作 2)处理效率低效. a)Map中间结果写 ...
- Kafka的优势有哪些?经常应用在哪些场景?
Kafka的优势有哪些?经常应用在哪些场景? Kafka的优势比较多如多生产者无缝地支持多个生产者.多消费者.基于磁盘的数据存储.具有伸缩性.高性能轻松处理巨大的消息流.多用于开发消息系统,网站活动追 ...
- RocketMQ消息存储的整体结构
RocketMQ的消息存储采用的是混合型的存储结构,也就是Broker单个实例下的所有队列公用一个日志数据文件CommitLog.这个是和Kafka又一个不同之处. 为什么不采用kafka的设计,针对 ...
- RocketMQ消息存储、刷盘、负载均衡
消息存储 消息存储是RocketMQ中最为复杂和最为重要的一部分. 消息存储总体架构 消息存储架构图: minOffset:当前队列的最小消息偏移量,如果消费时指定从最早消费,就是从该偏移量消费. m ...
- RocketMQ消息存储之刷盘机制(原理篇)
一.前言 RocketMQ的刷盘机制是一种确保消息可靠性的机制,简单来说就是Broker收到消息后,将消息存储到磁盘上.这样可以解决几个问题: 存储空间问题.内存空间有限,存入磁盘可以维护更多消息. ...
- RocketMQ消息存储原理
消息存储 CommitLog 1.消息内容和元数据都会存在CommitLog日志文件中2.消息内容不是定长的3.单个文件大小默认1G 文件名长度为20位 左边补零 剩余为起始偏移量 比如第一个文件名是 ...
- rocketmq存储消息mysql_再说rocketmq消息存储
两篇精彩的文章: rocketmq通过netty获取到消息请求后,直接掉处理模块,比如:SendMessageProcessor 这个处理类主要负责处理客户端发送消息的请求. 这个类实现了com.al ...
最新文章
- 5m 云服务器2核4g_华为云服务器2核4G 5M 248一年
- webpack-插件机制杂记
- 8.STM32中对ADC1_Config()函数(ADC1_GPIO_Config()和ADC1_Mode_Config())的理解(自定义)测试ADC转换电压值输出到终端上。
- JVM - Class常量池 || 运行时常量池
- Linux使用RSA实现免密登录(原理)
- /etc/fstab 参数详解及如何设置开机自动挂载
- Excel2003怎样拆分单元格
- 蓝桥杯 ALGO-29 算法训练 校门外的树(区间处理)
- 5.企业安全建设入门(基于开源软件打造企业网络安全) --- 业务安全
- 解决支持双面打印的打印机不能双面打印PDF
- SQLSERVER - 资源池 ‘internal‘ 没有足够的系统内存来运行此查询。
- java经典错误语句_【Java】Java代码经典错误清单
- QT绘图实现橡皮擦效果
- javac的命令(-Xbootclasspath、-classpath与-sourcepath等)
- Python系列 之 email模块 - 发送邮件
- python中列表的元素是什么数据类型_python基本数据类型之列表和元组(一)
- FCS20222-06-File Datebase
- java temporary_临时表temporary table
- [原创]从 TWAIN 设备中扫描图像
- 10个强大的Python数据科学技巧