存储文件

启动broker之后我们可以看到下面这些文件

1.config包含了运行期间一些配置信息,主要包括下列信息。

consumerFilter.json:主体消息过滤信息

consumerOffset.json:集群消费模式消息消费进度

delayOffset.json:延时消息队列拉取进度

subscriptionGroup.json:消息消费组配置

topic.json:topic配置属性

2.consumequeue:消息消费队列存储目录。

3.index:消息索引文件存储目录

4.abort:如果存在abort文件说明Broker非正常关闭,该文件默认启动时创建,正常退出前删除。

5.checkpoint:文件检查点,存储commitlog文件最后一次刷盘时间戳,consqueue最后一次刷盘时间,index索引文件最后一次刷盘时间戳。

commitlog每条消息的前面4个字节存储该条消息的总长度。

commitlog文件默认大小为1G,可通过broker配置文件中设置mappedFileSizeCommitLog属性来改变大小。

commitlog消息的查找

Commitlog#getMinOffset

获取当前Commitlog目录的最小偏移量,首先获取目录的第一个文件,如果文件可用则返回该文件的起始偏移量,否则返回下一个文件的起始偏移量

根据偏移量与消息长度查找消息:

如果只根据消息偏移查找消息,则首先找到文件内的偏移量,然后尝试读取4字节获取消息的实际长度,最后读取指定字节即可。

ConsumeQueue文件

ConsumeQueue文件可以看成是Commitlog关于消息消费的“索引”文件,consumequeue第一级目录为消息主题,第二级目录为主题的消息队列:

每一个Consumequeue条目不会存储消息的全量信息,8字节commitlog offset+4字节size+8字节tag hashcode

单个ConsumeQueue文件默认包含30w个条目,单个文件的长度为30w*20字节,单个ConsumeQueue文件可以看出是一个"ConsumeQueue条目"的数组,其下标为ConsumeQueue的逻辑偏移量,消息消费进度存储的偏移量即逻辑偏移量。其构建机制是当消息到达Commitlog文件后,由专门的线程产生消息转发任务,从而构建消息消费队列文件与下文提到的索引文件。

根据逻辑偏移消费消息:

ConsumeQueue#getIndexBuffer:

根据消息存储时间来查找:

二分查找法通过偏移量找时间,然后对比时间戳,先根据mappFile从commitlog中选中一段,再二分查找

mq存储文件的更多相关文章

  1. MQ服务器奔溃解决过程

    1.MQ服务器崩溃调节: 今天具安卓前端反应, 从昨天下午开始线上服务器使用 电话号码登陆和 使用电话号码注册功能不能使用, 经过前端仔细排查怀疑是后端问题,之后经过与ios前端 确认, 定位为后端服 ...

  2. 《我想进大厂》之MQ夺命连环11问

    继之前的mysql夺命连环之后,我发现我这个标题被好多套用的,什么夺命zookeeper,夺命多线程一大堆,这一次,开始面试题系列MQ专题,消息队列作为日常常见的使用中间件,面试也是必问的点之一,一起 ...

  3. mq内存映射

    MappedFileQueue的封装 MappedFileQueue是MappedFile的管理容器,MappedFileQueue是对存储目录的封装. 查找MappedFile: 1.根据时间戳来查 ...

  4. 【mq读书笔记】mq读写分离机制

    mq根据brokerName查找Broker地址的过程 mq根据MessageQueue查找Broker地址的唯一依据是brokerName,同一组Broker(M-S)他们的bokerName相同但 ...

  5. 【mq读书笔记】消费进度管理

    从前2节可以看到,一次消费后消息会从ProcessQueue处理队列中移除该批消息,返回ProcessQueue最小偏移量,并存入消息进度表中.那消息进度文件存储在哪合适呢? 广播模式:同一个消费组的 ...

  6. 【mq读书笔记】如何保证三个消息文件的最终一致性。

    考虑转发任务未成功执行,此时消息服务器Broker宕机,导致commitlog,consumeQueue,IndexFile文件数据不一致. commitlog,consumeQueue遍历每一条消息 ...

  7. R - MQ

    1. rabbit MQ 安装 Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang.通过下面两个连接下载安装3.2.3 版本: 下载并安装 ...

  8. 在 Windows 上安装Rabbit MQ 指南

    rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ...

  9. Android获取可存储文件所有路径

    引言:大家在做app开发的时候,基本都会保存文件到手机,android存储文件的地方有很多,不像ios一样,只能把文件存储到当前app目录下,并且android手机由于厂家定制了rom,sdcard的 ...

随机推荐

  1. 20202427-张启辰《Python3初学:罗马数字转阿拉伯数字》

    目录 20202427-张启辰<Python3初学:罗马数字转阿拉伯数字> 1.规则 2.局限性 3.Python3解决 20202427-张启辰<Python3初学:罗马数字转阿拉 ...

  2. 【Flutter 1-5】运行Flutter的第一个项目——计数器

    创建项目 创建Flutter项目有很多种方法,各个IDE工具也都集成了创建Flutter项目的快捷操作.我们这里列举三种方式:使用命令行创建.使用Android Studio创建和使用VSCode创建 ...

  3. Spring 5的最后一个特性版本5.3发布,4.3将于12月终止维护

    10月27日,Spring Framework团队宣布了5.3版本正式GA,Spring用户可以在repo.spring.io和Maven Central上获取到最新版本的依赖包. JDK的版本支持 ...

  4. BCVP,想真正为社区做努力的开发者们

    基于Net/Core,快速搭建 API & SPA 及微服务应用组织 BASE NETCORE (VUE) PROJECT TEAM 每一个.NET开发者都可以通过自己的开源项目(最好可以配套 ...

  5. 浅析I/O模型-select、poll、epoll

    I/O流 概念 (1)c++中将数据的输入输出称之为流(stream),在c++中,流被定义为类,成为流类(stream class),其定义的对象为流对象. (2)文件,套接字(socket),管道 ...

  6. CF1396E——Distance Matching

    传送门:QAQQAQ(题面翻译) 以后博客可能一直咕咕咕了.一些做题的思考可能会直接放在代码里而不是单独写博客,因为这样太浪费时间,只有一些比较新的题才会单独写博客 思路:对于这种构造可行解使得权值和 ...

  7. 20181301刘天宁 MyOD

    一.题目要求: 1.复习c文件处理内容编写myod.c 2.用myod XXX实现Linux下od -tx -tc XXX的功能 3.main与其他分开,制作静态库和动态库 4.编写Makefile ...

  8. 腾讯开源 APIJSON 连创五个第一

    腾讯第一个码云推荐项目,// 其它最早创建的是 TencentOS-tiny(码云) 2019.8.23 腾讯第一个码云GVP项目,// 其它最早创建的是 TencentOS-tiny(码云) 201 ...

  9. EF6 Code First 博客学习记录

    学习一下ef6的用法 这个学习过程时按照微软官网的流程模拟了一下 就按照下面的顺序来写吧 1.连接数据库  自动生成数据库 2.数据库迁移 3.地理位置以及同步/异步处理(空了再补) 4.完全自动迁移 ...

  10. 快速了解阿里微服务热门开源分布式事务框架——Seata

    一.Seata 概述 Seata 是 Simple Extensible Autonomous Transaction Architecture 的简写,由 feascar 改名而来. Seata 是 ...