博客
关于我
RocketMQ消息存储结构分析及相对于Kafka的优势
阅读量:539 次
发布时间:2019-03-09

本文共 1338 字,大约阅读时间需要 4 分钟。

RocketMQ的消息存储结构与Kafka存在显著差异,理解这一点有助于更好地掌握其工作机制。本文将详细阐述RocketMQ的核心存储逻辑。

消息存储结构概述

RocketMQ采用双层存储架构:即CommitLogConsumerQueue。这里 CommitLog 负责存储消息的高 متحده数据,而 ConsumerQueue 则负责维护消息的位置信息。这种设计充分利用了磁盘的顺序写优化能力,确保数据存储效率。

CommitLog存储机制

CommitLog 实际上是一个日志文件,默认大小不超过1GB,超过后会切换到新文件继续存储。每条消息在存储过程中需要经过多个步骤才能完成落地:

  • 消息编码:消息会被拆分为多个固定格式的区块,每个区块包含以下字段:

    • 消息长度(4字节)
    • 魔数(4字节,固定值)
    • CRC校验码(4字节)
    • 消息队列ID(4字节)
    • 标记位(4字节)
    • 在ConsumerQueue中的位置偏移量(8字节)
    • 在存储文件中的物理位置偏移量(8字节)
    • 系统相关标记位(4字节)
    • 消息创建时间(8字节)
    • 消息生产主机名(8字节)
    • 消息存储时间(8字节)
    • 消息存储机器的主机名(8字节)
    • 重复消费次数(4字节)
    • 事务相关位置偏移量(8字节)
    • 消息体实际长度(4字节)
    • Topic长度(1字节)
    • Topic内容(占用长度与上述1字节相同)
    • Properties长度(2字节)
    • Properties内容(与上述2字节长度相同)
  • 数据存储:所有信息按固定顺序写入CommitLog文件,确保磁盘IO为顺序执行,提升性能。

  • ConsumerQueue的存储功能

    ConsumerQueue 旨在维护消息的位置信息,主要包含以下字段:

    • Offset:在CommitLog文件中的偏移位置。
    • Size:消息占用的字节数。
    • TagCode:消息所属的标签编码。

    消息数据存储特点

    值得注意的是,RocketMQ并未直接存储消息内容。所有具体消息数据均留存在CommitLog文件中,而ConsumerQueue仅存储消息在存储系统中的位置信息。这与Kafka的存储方式存在显著不同(Kafka直接储存消息内容)。这一设计使得 RocketMQ 的 ConsumerQueue 较小,且能更高效地支持大量 partition。

    RocketMQ与Kafka的对比

  • I/O 顺序:RocketMQ 的 CommitLog 采用顺序I/O,减少磁盘操作成本。相比之下,Kafka采用随机I/O,导致读写性能较低。

  • 消息存储方式:RocketMQ 仅存储消息的位置信息(20字节),而Kafka 则完整储存消息内容。这种差异使 RocketMQ 在单 broker 环境下能支持更多 topic 和 partition。

  • 消息数据大小:由于每条消息仅需存储20字节位置信息,RocketMQ 的 ConsumerQueue 读写效率较高。其通过使用 MappedFile 技术,利用操作系统的内存缓存进一步提升性能。

  • 通过上述分析,可以看出 RocketMQ 的设计理念与 Kafka 有着本质的区别,其核心目标在于平衡存储效率与系统扩展性。了解这一点对于分布式系统的优化选择至关重要。

    转载地址:http://ztisz.baihongyu.com/

    你可能感兴趣的文章
    redis只能做缓存?你错了
    查看>>
    16-Android屏幕亮度调节
    查看>>
    17-Android系统应用默认开机启动
    查看>>
    Android Launcher 之源码下载
    查看>>
    设计模式(18)——中介者模式
    查看>>
    net start mysql 发生系统错误2 系统找不到指定的文件
    查看>>
    发工资的骚操作。。
    查看>>
    送一个ipad【最后一个】
    查看>>
    重磅!大数据《实战全栈工程师成长手册》,附 PDF & PPT 下载
    查看>>
    JAVA异常和基础类库
    查看>>
    洛谷【数据结构1-1】线性表
    查看>>
    AI技术国际领先!一文回顾百度大脑的2020
    查看>>
    CVPR 2021 | 港科大&旷视提出ACON:激活还是不激活?学习自定义激活函数
    查看>>
    EfficientNetV2震撼发布!更小的模型,更快的训练
    查看>>
    python-计网实验二-套接字
    查看>>
    C++学习日记2——多态篇的纯虚函数和抽象类
    查看>>
    F - 数据结构实验之链表四:有序链表的归并
    查看>>
    为什么使用%lf读取double型的值,而用%f进行显示?
    查看>>
    用JavaScript实现希尔排序
    查看>>
    iconfont字体图标导入到vue项目中
    查看>>