热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RocketMq消息持久化

一、为什么要持久化:防止消息丢失。二、rmq消息持久化方式:在rmq中采用CommitLog和ConsumeQueue2个文件结合来持久化消息。其

一、为什么要持久化:

防止消息丢失。


二、rmq消息持久化方式 :

在rmq中采用 CommitLog和ConsumeQueue 2个文件结合来持久化消息。其中CommitLog是用来存放消息实体的,文件位置在store/commitLog目录下,一个broker共用同一个commitlog目录下所有文件。consumeQueue是消息的索引文件,用来指示消息在commitLog中的具体位置,文件位置在store/consumeQueue目录下,在consumeQueue目录下,会根据topic和topic包含的queueId创建二级目录,然后在该目录下创建consumeQueue索引文件。

commitLog目录结构:

commitLog文件以文件起始字节数命名,图片中第二个文件的起始字节数为1073741824=2^30=1G,说明commitLog每个文件大小为1G,把文件大小控制在1G,和java NIO中MappperedByteBuffer文件内存映射限制有关系。

commitLog文件持久化协议:

其中存放bodyLength为4个字节,可以计算出我们可以发送的最大消息体为2^23/2^20=4M

consumeQueue目录结构:

consumeQueue文件通过topic和queueId目录来加快索引速度,每个文件可以存放30W个消息索引,每个索引大小20Byte,那么每个索引文件大小为30 0000 * 20 Byte / 2^ 20 = 5.7M。

consumeQueue文件持久化协议:

consumeQueue文件中数据是以块存储的,每个块固定20Byte,其中offset为消息在CommitLog文件中的偏移量占8个Byte,size为消息体的大小占4个Byte,tagCode为消息体中tag的哈希值占8个Byte。


三、根据索引文件后去消息:

1、当我们拿到索引文件的一个数据块后,先取出前面八个字节 offset(消息在commitLog中起始地址。

2、计算消息所在的commitLog文件,offset / 1G (commitLog文件大小)获取到commitLog文件的序号。

3、通过序号获取对应的commitLog文件,计算相对起始位置,pos = offset - commitLog.formOffset (commitLog的起始字节数)。

4、通过起始位置和size获取对应的消息。


四、持久化和索引分开的目的:

1、设计初衷,顺序写入,随机读取。

2、顺序写入提升写入速度。


五、架构图:

 


推荐阅读
  • 本文深入探讨了UNIX/Linux系统中的进程间通信(IPC)机制,包括消息传递、同步和共享内存等。详细介绍了管道(Pipe)、有名管道(FIFO)、Posix和System V消息队列、互斥锁与条件变量、读写锁、信号量以及共享内存的使用方法和应用场景。 ... [详细]
  • 深入解析Hadoop的核心组件与工作原理
    本文详细介绍了Hadoop的三大核心组件:分布式文件系统HDFS、资源管理器YARN和分布式计算框架MapReduce。通过分析这些组件的工作机制,帮助读者更好地理解Hadoop的架构及其在大数据处理中的应用。 ... [详细]
  • 本文详细介绍了如何在Ubuntu系统中下载适用于Intel处理器的64位版本,涵盖了不同Linux发行版对64位架构的不同命名方式,并提供了具体的下载链接和步骤。 ... [详细]
  • Scala 实现 UTF-8 编码属性文件读取与克隆
    本文介绍如何使用 Scala 以 UTF-8 编码方式读取属性文件,并实现属性文件的克隆功能。通过这种方式,可以确保配置文件在多线程环境下的一致性和高效性。 ... [详细]
  • 本文探讨了领域驱动设计(DDD)的核心概念、应用场景及其实现方式,详细介绍了其在企业级软件开发中的优势和挑战。通过对比事务脚本与领域模型,展示了DDD如何提升系统的可维护性和扩展性。 ... [详细]
  • 毕业设计:基于机器学习与深度学习的垃圾邮件(短信)分类算法实现
    本文详细介绍了如何使用机器学习和深度学习技术对垃圾邮件和短信进行分类。内容涵盖从数据集介绍、预处理、特征提取到模型训练与评估的完整流程,并提供了具体的代码示例和实验结果。 ... [详细]
  • 本文介绍如何使用布局文件在Android应用中排列多行TextView和Button,使其占据屏幕的特定比例,并提供示例代码以帮助理解和实现。 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • 并发编程 12—— 任务取消与关闭 之 shutdownNow 的局限性
    Java并发编程实践目录并发编程01——ThreadLocal并发编程02——ConcurrentHashMap并发编程03——阻塞队列和生产者-消费者模式并发编程04——闭锁Co ... [详细]
  • 深入解析 Android IPC 中的 Messenger 机制
    本文详细介绍了 Android 中基于消息传递的进程间通信(IPC)机制——Messenger。通过实例和源码分析,帮助开发者更好地理解和使用这一高效的通信工具。 ... [详细]
  • 深入剖析JVM垃圾回收机制
    本文详细探讨了Java虚拟机(JVM)中的垃圾回收机制,包括其意义、对象判定方法、引用类型、常见垃圾收集算法以及各种垃圾收集器的特点和工作原理。通过理解这些内容,开发人员可以更好地优化内存管理和程序性能。 ... [详细]
  • docker镜像重启_docker怎么启动镜像dock ... [详细]
  • 使用WinForms 实现 RabbitMQ RPC 示例
    本文通过两个WinForms应用程序演示了如何使用RabbitMQ实现远程过程调用(RPC)。一个应用作为客户端发送请求,另一个应用作为服务端处理请求并返回响应。 ... [详细]
  • 本文探讨了Web开发与游戏开发之间的主要区别,旨在帮助开发者更好地理解两种开发领域的特性和需求。文章基于作者的实际经验和网络资料整理而成。 ... [详细]
author-avatar
阿芙2011
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有