开发者学堂课程【RocketMQ 知识精讲与项目实战(第三阶段):消息存储总结】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/704/detail/12491
消息存储总结
消息存储总结
RocketMQ 的存储文件包括消息文件(Commitlog)、消息消费队列文件(ConsumerQueue)、Hash索引文件(IndexFile)、监测点文件(checkPoint)、abort(关闭异常文件)。单个消息存储文件、消息消费队列文件、Hash索引文件以长度固定的方式进行创建,这样做的目的是以便使用内存映射机制进行文件的读写操作。
RocketMQ组织文件以文件的起始偏移量来命令文件,这样根据偏移量能快速定位到真实的物理文件。 RocketMQ 的数据写到内存文件之后,基于内存映射文件机制提供了同步刷盘和异步刷盘两种机制,异步刷盘是指在消息存储时先追加到内存映射文件,然后启动专门的刷盘线程定时将内存中的文件数据刷写到磁盘。
CommitLog 在消息存储文件当中是非常重要的一个文件,RocketMQ 为了保证消息发送的高吞吐量,所以采用单一文件存储所有主题消息,保证消息存储是完全的顺序写,但这样给文件读取带来了不便,为此 RocketMQ 为了方便消息消费构建了消息消费队列文件,基于主题与队列进行组织,同时RocketMQ为消息实现了Hash索引,可以为消息设置索引键,根据所以能够快速从 CommitLog 文件中检索消息。
当消息达到 CommitLog 后,会通过 ReputMessageService 线程接近实时地将消息转发给消息消费队列文件与索引文件。在数据分发的过程当中,如果出现了问题,它引入了消息队列、索引文件以及数据恢复的机制。在进行文件恢复的时候,又分为正常恢复和异常关闭两种形式。采用abort文件就能对两种形式进行区分。正常恢复是在倒数第三个 CommitLog 去进行恢复,而异常恢复是在倒数第一个 CommitLog 去进行恢复。为了安全起见, RocketMQ 引入abort文件,记录Broker的停机是否是正常关闭还是异常关闭,在重启Broker 时为了保证 CommitLog 文件,消息消费队列文件与 Hash 索引文件的正确性,分别采用不同策略来恢复文件。
RocketMQ 不会永久存储消息文件、消息消费队列文件,它们则会存在于过期的一个时间,过期时间则是在72小时,72小时则会被删除掉。其他的启动文件过期机制并在磁盘空间不足或者默认凌晨4点删除过期文件,文件保存72小时并且在删除文件时并不会判断该消息文件上的消息是否被消费。并且它也提供了一些人工的机制,采用这种方式就可以直接进行删除。