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

news2024/11/15 19:32:42

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

  • 马士兵教育
  • 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%以后,就会立刻启动过期文件删除机制。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

15、Spring Cloud Alibaba Sentinel实现熔断与限流

注:本篇文章主要参考周阳老师讲解的cloud进行整理的! 1、Sentinel 1.1、官网 https://sentinelguard.io/zh-cn/ 等价对标 Spring Cloud Circuit Breaker 1.2、是什么 https://github.com/alibaba/Sentinel/wiki 1.3、去哪下 https://github.com/alibab…

面向低成本巡线机器人的PID控制器优化——文末源码

目录 介绍 测试 电子元器件 系统特征 控制器设计 位置误差的计算 比例控制 积分控制 微分控制 改进的PID控制器 测试轨迹 源码链接 本文对经典PID控制器的改进和开环控制机制的发展进行了讨论,以提高差动轮式机器人的稳定性和鲁棒性。为了部署该算法&am…

Java学习Day3

一道简单练习题&#xff0c;对编号进行随机排名 import java.util.Random; import java.util.Scanner;public class Main {public static void rand(int[] a,int n){Random rnew Random();for (int i0;i<n;i){int rrr.nextInt(n);int tempa[i];a[i]a[rr];a[rr]temp;}}publ…

吴恩达机器学习-可选实验室:Softmax函数

文章目录 CostTensorflow稀疏类别交叉熵或类别交叉熵祝贺 在这个实验室里&#xff0c;我们将探索softmax函数。当解决多类分类问题时&#xff0c;该函数用于Softmax回归和神经网络。 import numpy as np import matplotlib.pyplot as plt plt.style.use(./deeplearning.mplstyl…

【Go】初始化项目

初始化 go mod init 项目的名字然后按照提示&#xff1a; 这一步会将依赖包安装上去 go mod tidy最后编译&#xff1a; go build *.go

Redis实战篇session共享问题

实战篇Redis 1.6、session共享问题 核心思路分析&#xff1a; 每个tomcat中都有一份属于自己的session,假设用户第一次访问第一台tomcat&#xff0c;并且把自己的信息存放到第一台服务器的session中&#xff0c;但是第二次这个用户访问到了第二台tomcat&#xff0c;那么在第…

抖店还好做吗?新人刚做有什么注意事项吗?2024抖店创业指南

我是王路飞。 “抖店还好做吗&#xff1f;”“现在入局抖店晚不晚&#xff1f;”“抖店还能做吗&#xff1f;” 这种累死的问题&#xff0c;在我20年开始做抖店的时候&#xff0c;就经常被人这样问。 一直到2024年的今天&#xff0c;依旧有很多人私信我&#xff0c;其中相当…

从数据页的角度看 B+ 树

资料来源 : 小林coding 小林官方网站 : 小林coding (xiaolincoding.com) 大家背八股文的时候&#xff0c;都知道 MySQL 里 InnoDB 存储引擎是采用 B 树来组织数据的。 这点没错&#xff0c;但是大家知道 B 树里的节点里存放的是什么呢&#xff1f;查询数据的过程又是怎样的&am…

【进程概念】Linux进程状态 | 僵尸进程 | 孤儿进程

目录 Linux中的进程状态 R运行状态&S休眠状态 T/t停止状态stopped(tracing stop) D磁盘休眠状态Disk sleep X死亡状态dead&Z僵尸状态zombie 僵尸进程 僵尸进程的理解 演示僵尸进程 僵尸进程的危害 孤儿进程 孤儿进程的理解 演示孤儿进程 进程状态的查看…

简化业务流程,AppLink连接一定签

APPlink是什么 APPlink是RestCloud打造的一款简单易用的零代码自动化集成平台&#xff0c;为业务流程提供自动化的解决方案&#xff0c;将企业内部的核心系统以及第三方应用程序和云服务等进行集成。无论是开发人员还是业务人员&#xff0c;都可以使用APPlink轻松构建出高效、…

锁的7大分类

锁 首先会了解锁的整体概念&#xff0c;了解锁究竟有哪些分类的标准。在后面的文章中会对重要的锁进行详细的介绍。 锁的7大分类 需要首先指出的是&#xff0c;这些多种多样的分类&#xff0c;是评价一个事物的多种标准&#xff0c;比如评价一个城市&#xff0c;标准有人口多…

鸿蒙Harmony应用开发—ArkTS-高级组件:@ohos.advertising.AdComponent (非全屏广告展示组件))

本模块提供展示非全屏广告的能力。 说明&#xff1a; 本模块首批接口从API Version 11开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import { AdComponent } from ohos.advertising.AdComponent; AdComponent AdComponent(ads: Ar…

基于springboot+vue+Mysql的校园交友网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

基于Java校园跑腿管理系统设计与实现(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

OSCP靶场--Crane

OSCP靶场–Crane 考点(CVE-2022-23940sudo service提权) 1.nmap扫描 ┌──(root㉿kali)-[~/Desktop] └─# nmap 192.168.229.146 -sC -sV --min-rate 2500 Starting Nmap 7.92 ( https://nmap.org ) at 2024-03-25 08:07 EDT Nmap scan report for 192.16…

项目中如何进行限流(限流的算法、实现方法详解)

❤ 作者主页&#xff1a;李奕赫揍小邰的博客 ❀ 个人介绍&#xff1a;大家好&#xff0c;我是李奕赫&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 记得点赞、收藏、评论⭐️⭐️⭐️ &#x1f4e3; 认真学习!!!&#x1f389;&#x1f389; 文章目录 限流的算法漏…

jdk api之UnsupportedEncodingException基础、应用、实战

博主18年的互联网软件开发经验&#xff0c;从一名程序员小白逐步成为了一名架构师&#xff0c;我想通过平台将经验分享给大家&#xff0c;因此博主每天会在各个大牛网站点赞量超高的博客等寻找该技术栈的资料结合自己的经验&#xff0c;晚上进行用心精简、整理、总结、定稿&…

力扣HOT100 - 49. 字母异位词分组

解题思路&#xff1a; 排序 注意&#xff1a; 返回时不能用List&#xff0c;因为List是抽象类&#xff0c;return的必须是List的具体实现&#xff0c;如ArrayList class Solution {public List<List<String>> groupAnagrams(String[] strs) {Map<String, Lis…

哈希存储、哈希表、哈希表的基本操作、算法的一些概念

我要成为嵌入式高手之3月25日数据结构第七天&#xff01;&#xff01; ————————————————————————————— 搜索(查找)二叉树 思想&#xff1a;左大右小 主要为了进行二分查找&#xff0c;由于根节点选择不合适&#xff0c;容易造成树不平衡&#…

NOMA免调度接入技术

标题 系统模型 参考视频&#xff1a;添加链接描述 利用接收机的复杂度提升为代价&#xff0c;提升频谱效率。为了保证上行方向上面&#xff0c;能够接入更多的用户&#xff0c;NOMA的根本思路&#xff0c;就是让多个用户占用相同的资源进行上行传输 系统模型 采用TDMA的方式…