RocketMQ学习笔记:消息存储模型,持久化文件,过期文件删除

这是本人学习的总结,主要学习资料如下

  • 马士兵教育
  • rocketMq官方文档

目录

  • 1、消息存储结构
    • 1.1、CommitLog详解
      • 1.1.1、CommitLog存储的优点
    • 1.2、ConsumeQueue详解
    • 1.3、Index详解
  • 2、持久化文件
  • 3、过期文件删除机制
    • 3.1、判断过期文件
    • 3.2、删除的时机


1、消息存储结构

消息在消息队列中的存储结构如下所示。这三个模块都是文件。默认放在${user.home}/store之下。

  • 首先是左边的CommitLog,不管是什么topic,所有的消息都是放到这个集合之中。存储着消息的topicmessage等消息的元数据。
  • 右上角的是Comsummequeue,是逻辑消息队列,代表着一个topic底下的一个queue。里面顺序存放着属于这个queue的所有消息。不过这是存放消息的地址和偏移量,消息的其他信息还需要到CommitLog中读取。
  • Index则是记录着所有消息的索引。RocketMQ提供通过idKey来快速查询到一个msg。因为id是由brokerId+offset构成的,所以自然能从commitLog中读取消息。Index中则记录keyoffset的映射,所以可以通过key快速找到一个msg

1.1、CommitLog详解

CommitLog采访者消息的所有元信息。每个CommitLog都被本机上的所有queue共享,与消息的topic等无关。

消息的存储结构和Redis的压缩列表类似。每个消息的前面存放一些元数据,后面放消息的具体内容。这样每个消息的长度是不固定的。
请添加图片描述

每个CommitLog文件默认是1G。如果消息塞满了一个文件则会生成一个新的,并且令其初始偏移量在上一个文件的基础上加1073741824(1G = 1073741824byte)。

在写消息时,尽管有多个生产者会同时发送消息,但永远是一个一个地往CommitLog中写消息。

1.1.1、CommitLog存储的优点

  1. CommitLog 顺序写 ,可以大大提高写入效率。
    实际上,磁盘有时候会比你想象的快很多,有时候也比你想象的慢很多,关键在如何使用,使用得当,磁盘的速度完全可以匹配上网络的数据传输速度。目前的高性能磁盘,顺序写速度可以达到600MB/s ,超过了一般网卡的传输速度,这是磁盘比想象的快的地方 但是磁盘随机写的速度只有大概lOOKB/s,和顺序写的性能相差 6000 倍。
  2. 虽然是随机读,但是利用操作系统的 pagecache 机制,可以批量地从磁盘读取,作为 cache 存到内存中,加速后续的读取速度。
  3. 为了保证完全的顺序写,需要ConsumeQueue这个中间结构 ,因为ConsumeQueue 里只存偏移量信息,所以尺寸是有限的,在实际情况中,大部分的 ConsumeQueue能够被全部读入内存,所以这个中间结构的操作速度很快,可以认为是内存读取的速度。此外为了保证 CommitLogConsumeQueue的一致性, CommitLog 里存储了 Consume QueuesMessage KeyTag 等所有信息,即使 ConsumeQueue 丢失,也可以通过CommitLog 完全恢复出来。



1.2、ConsumeQueue详解

ComsumeQueue是一个逻辑队列,代表了一个topic下的一个queue。它里面只存储消息的索引,不存具体的信息,具体的消息信息要到CommitLog中寻找。

下面是具体存储结构。
在这里插入图片描述

1.3、Index详解

RocketMQ提供通过idKey来快速查询到一个msg。因为id是由brokerId+offset构成的,所以自然能从commitLog中读取消息。Index中则记录keyoffset的映射,所以可以通过key快速找到一个msg

2、持久化文件

RocketMQ的持久化文件默认会放到${user.home}/store目录下,也可以在broker.conf中配置storePathRootDir修改路径。

一般有下面这几个文件。
请添加图片描述

  • commitlog: 消息存储的元数据
  • config:运行期间的一些配置信息。
  • consumerqueue:消息消费对了存储目录。
  • index:消息索引文件存储目录。
  • abort:如果存在该文件则表示MQ是非正常关闭的。
  • checkPoint:文件检查点,存储着commitlogconsumerqueueindex文件最后一次刷盘时间戳。

3、过期文件删除机制

3.1、判断过期文件

RocketMQ的持久化文件不会永远存在,每隔一段时间就会清理掉一部分。主要是删除CommitLogConsumeQueue这两个文件。

RocketMQ中,一段时间内没更新的文件就被视为过期文件,不管里面的消息是不是全都被消费了。

默认是42小时没有更新就删除,默认时间根据版本的不同而不同,这个也是可以在broker.config中配置的,fileReserveTime

删除文件是由定时任务做的,默认10s扫描一次。

判断是否要删除过期文件的机制总共和下面这几个个参数有关

  • fileReserveTime:单位小时,超过这个时间没更新的文件就是过期文件。
  • destroyMapedFileIntervalForcibly:当清理线程准备删除一个文件时,如果这个文件还被其他线程引用,取消这次删除操作并记录当前时间。destroyMapedFileIntervalForcibly表示在一段时间内(单位是ms),会一直保留这个文件。超过这个时间以后,每次清理线程发现这个文件就会减少1000个对该文件的引用,直到引用数变成0,删除该文件。

3.2、删除的时机

默认是10秒一次扫描,但是有下面的特殊情况也会触发扫描。

  • deleteWhen:将扫描时间固定成一天当中的某个时刻执行一次,比如凌晨4点。
  • DiskSpaceCleanForciblyRatio:默认值85。表示磁盘空间使用率达到85%以后,就会立刻启动过期文件删除机制。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/490589.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

大模型时代的向量数据库:原理解析和应用案例

大家好,在人工智能领域,数据处理和加工的需求愈发增加。随着人们深入探索AI高级的应用,如图像识别、语音搜索和推荐引擎等,数据的复杂性也在不断地增加。此时传统的数据库存储方式已不能完全满足需求,向量数据库应运而…

《出海和跨境:明道云HAP支撑全球化业务的能力白皮书》正式发布

随着全球化进程的加速,越来越多的企业开始寻求海外市场的拓展机会。然而在出海道路上,企业面临着诸多挑战,比如跨时区的协作困难、文化差异、信息异步、技术障碍等。 明道云HAP作为一款前沿的企业软件产品,致力于赋能企业跨境经营…

Jwt 报错 : Cannot resolve method ‘parseClaimsJws‘ in ‘JwtParserBuilder‘

Java 环境 Java 版本&#xff1a; jkd11 jwt依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.12.5</version></dependency>报错如下图所示 解决方法 在pom.xml中把 jjwt 的依…

2024年【安全员-C证】考试及安全员-C证考试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-C证考试根据新安全员-C证考试大纲要求&#xff0c;安全生产模拟考试一点通将安全员-C证模拟考试试题进行汇编&#xff0c;组成一套安全员-C证全真模拟考试试题&#xff0c;学员可通过安全员-C证考试题全真模拟…

【MySQL】数据库--基础

目录 一、概念&#xff1a; 二、连接数据库[Dos命令] 三、SQL 语句分类 一、概念&#xff1a; MySQL 是一种开源的关系数据库管理系统 (RDBMS)数据库-表的本质仍然是文件 二、连接数据库[Dos命令] mysql -h&#xff1a;mysql服务的主机&#xff08;默认连接到本机服务器&…

2024.3.26学习笔记

今日学习韩顺平java0200_韩顺平Java_对象机制练习_哔哩哔哩_bilibili 今日学习p273-p285 包 包的本质实际上就是创建不同的文件夹/目录来保存类文件 包的三大作用 区分相同名字的类 当类很多时&#xff0c;可以很好的管理类 控制访问范围 包的基本语法 package com.xx…

第九届蓝桥杯大赛个人赛省赛(软件类)真题C 语言 A 组-分数

solution1 直观上的分数处理 #include <iostream> using namespace std; int main() {printf("1048575/524288");return 0; }#include<stdio.h> #include<math.h> typedef long long ll; struct fraction{ll up, down; }; ll gcd(ll a, ll b){if…

UE5、CesiumForUnreal实现海量POI撒点显示与聚合功能

1.实现目标 POI是UE+GIS三维场景中经常需要展示的要素,在UE中常用的表示POI方法有两种。一种是Mesh,即空间的方式;另一种是Widget,即屏幕上的方式,本文这里使用的是Widget屏幕展示的形式来表示POI。 本文这里使用的POI点位数量共3.3w+,采用直接网格聚合算法,并进行性能优…

Excel学习笔记(持续更新-20240326)

写在前面 Excel的学习心得分享&#xff0c;佛系更新。2024/03/26 目录 Excel每次都是以只读模式打开 给Excel设置“开机密码” 保护你的excel不让别人篡改 1.1Excel每次都是以只读模式打开 背景&#xff1a;如果有个工具&#xff0c;每天都有很多人使用&#xff0c;如果是…

Spring设计模式-实战篇之单例模式

实现案例&#xff0c;饿汉式 Double-Check机制 synchronized锁 /*** 以饿汉式为例* 使用Double-Check保证线程安全*/ public class Singleton {// 使用volatile保证多线程同一属性的可见性和指令重排序private static volatile Singleton instance;public static Singleton …

算法系列--动态规划--⼦数组、⼦串系列(数组中连续的⼀段)(1)

&#x1f495;"我们好像在池塘的水底&#xff0c;从一个月亮走向另一个月亮。"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;算法系列–动态规划–⼦数组、⼦串系列&#xff08;数组中连续的⼀段&#xff09;(1) 大家好,今天为大家带来的是算法系…

插槽和自定义命令

自定义指令 自定义的指令,定义好之后,在标签内使用,当执行new Vue去模板的时候,看到自定义指令,会将下面的函数,等到特定执行Vue实例阶段触发.模板渲染之后.当触发时的传参的参数的第一个是所写的对象的DOM对象,第二个是是包含指令的对象,对象value是指令赋值.当把指令写到标签…

qt生成word文档(wps),代码如下

这是我自己写的&#xff0c;建议往下滑&#xff0c;大佬写的很清楚&#xff0c;我的代码只是人家的一个摘抄部分 链接&#xff1a;https://pan.baidu.com/s/1MgG_dO8hCUi7ErQnOncNOg?pwd1234 提取码&#xff1a;1234使用方法&#xff1a; #include "ExportReport.h&qu…

6个步骤轻松实现 postman 接口压力测试(建议收藏)

这里讲是postman做接口并发测试&#xff0c;基础用法不做赘述 1、第一步接口可以通的情况下点击右上角save 2、将相应信息填入 3、如果是同一个接口修改不同的值如下图 4、点击左上角Runner 5、选择刚才所建接口集合、填入要执行次数 6、查看运行结果 总结&#xff1a; 感谢每…

24计算机考研调剂 | 【官方】湘潭大学

湘潭大学 考研调剂要求 招生专业&#xff1a; 调剂基本要求&#xff1a; &#xff08;1&#xff09;基本要求同《湘潭大学2024年硕士研究生复试录取工作方案》。 &#xff08;2&#xff09;初试成绩要求&#xff1a; 初试成绩各单科均须达到A类考生进入复试的初试成绩基本要…

代码随想录算法训练营第四十六天|139.单词拆分、56. 携带矿石资源(第八期模拟笔试)

139.单词拆分 刷题https://leetcode.cn/problems/word-break/description/文章讲解https://programmercarl.com/0139.%E5%8D%95%E8%AF%8D%E6%8B%86%E5%88%86.html视频讲解https://www.bilibili.com/video/BV1pd4y147Rh/?vd_sourceaf4853e80f89e28094a5fe1e220d9062 题解&…

微服务(基础篇-005-Gateway)

目录 Gateway介绍&#xff1a; 为什么需要网关&#xff08;1&#xff09; gateway快速入门&#xff08;2&#xff09; 断言工厂&#xff08;3&#xff09; 过滤器工厂&#xff08;4&#xff09; 过滤器工厂介绍及案例&#xff08;4.1&#xff09; 默认过滤器&#xff08…

公众号超牛鼻的爆文仿写机器人,原创三篇只需6分钟,篇篇是爆文基因

大家好&#xff0c;我是大胡子&#xff0c;专注于RPA提效​&#xff0c;今天就介绍一款公众号超牛鼻的爆文仿写机器人​。 和以前的公众号爆文机器人不太一样&#xff0c;以前的爆文机器人需要手动插入图片、添加封面、插入话题&#xff0c;然后今天这个机器人就完全解决这几个…

Redission 分布式锁原理分析

一、前言 我们先来说说分布式锁&#xff0c;为啥要有分布式锁呢? 像 JDK 提供的 synchronized、Lock 等实现锁不香吗&#xff1f;这是因为在单进程情况下&#xff0c;多个线程访问同一资源&#xff0c;可以使用 synchronized 和 Lock 实现&#xff1b;在多进程情况下&#xff…

美团面试一面凉经

1.自我介绍 2.科研项目提问 没咋准备&#xff0c;说的有点没逻辑 3.问论坛项目 为什么用Redis实现登录&#xff1f;能不能用其他方式实现&#xff1f; 1、Redis 具备高性能 假如用户第一次访问 MySQL 中的某些数据。这个过程会比较慢&#xff0c;因为是从硬盘上读取的。将…