热门标签 | 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、顺序写入提升写入速度。


五、架构图:

 


推荐阅读
  • 服务器虚拟化存储设计,完美规划储存与资源,部署高性能虚拟化桌面
    规划部署虚拟桌面环境前,必须先估算目前所使用实体桌面环境的工作负载与IOPS性能,并慎选储存设备。唯有谨慎估算贴近实际的IOPS性能,才能 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 如何高效解决Android应用ANR问题?
    本文介绍了ANR(应用程序无响应)的基本概念、常见原因及其解决方案,并提供了实用的工具和技巧帮助开发者快速定位和解决ANR问题,提高应用的用户体验。 ... [详细]
  • 本文将深入探讨 Unreal Engine 4 (UE4) 中的距离场技术,包括其原理、实现细节以及在渲染中的应用。距离场技术在现代游戏引擎中用于提高光照和阴影的效果,尤其是在处理复杂几何形状时。文章将结合具体代码示例,帮助读者更好地理解和应用这一技术。 ... [详细]
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • 前言:由于Android系统本身决定了其自身的单线程模型结构。在日常的开发过程中,我们又不能把所有的工作都交给主线程去处理(会造成UI卡顿现象)。因此,适当的创建子线程去处理一些耗 ... [详细]
  • 本文总结了近年来在实际项目中使用消息中间件的经验和常见问题,旨在为Java初学者和中级开发者提供实用的参考。文章详细介绍了消息中间件在分布式系统中的作用,以及如何通过消息中间件实现高可用性和可扩展性。 ... [详细]
  • 视觉Transformer综述
    本文综述了视觉Transformer在计算机视觉领域的应用,从原始Transformer出发,详细介绍了其在图像分类、目标检测和图像分割等任务中的最新进展。文章不仅涵盖了基础的Transformer架构,还深入探讨了各类增强版Transformer模型的设计思路和技术细节。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.jena.atlas.lib.ByteBufferLib 类下的 acopyArray 方法,并提供了多个实际应用中的代码示例,帮助开发者更好地理解和使用该方法。 ... [详细]
  • 入门指南:使用FastRPC技术连接Qualcomm Hexagon DSP
    本文旨在为初学者提供关于如何使用FastRPC技术连接Qualcomm Hexagon DSP的基础知识。FastRPC技术允许开发者在本地客户端实现远程调用,从而简化Hexagon DSP的开发和调试过程。 ... [详细]
  • 流处理中的计数挑战与解决方案
    本文探讨了在流处理中进行计数的各种技术和挑战,并基于作者在2016年圣何塞举行的Hadoop World大会上的演讲进行了深入分析。文章不仅介绍了传统批处理和Lambda架构的局限性,还详细探讨了流处理架构的优势及其在现代大数据应用中的重要作用。 ... [详细]
  • 计算机学报精选论文概览(2020-2022)
    本文汇总了2020年至2022年间《计算机学报》上发表的若干重要论文,旨在为即将投稿的研究者提供参考。 ... [详细]
  • 管理UINavigationController中的手势返回 - Managing Swipe Back Gestures in UINavigationController
    本文介绍了如何在一个简单的闪存卡片应用中实现平滑的手势返回功能,以增强用户体验。 ... [详细]
  • 驱动程序的基本结构1、Windows驱动程序中重要的数据结构1.1、驱动对象(DRIVER_OBJECT)每个驱动程序会有唯一的驱动对象与之对应,并且这个驱动对象是在驱 ... [详细]
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社区 版权所有