RocketMQ存储之DefaultMessageStore(一)

本文详细分析了RocketMQ的DefaultMessageStore,包括其功能概述、源码解析,如MessageStore接口、成员变量、启动和停机过程。DefaultMessageStore依赖于CommitLog、ConsumeQueue和IndexFile进行存储,并在启动过程中进行数据恢复和一致性检查。
摘要由CSDN通过智能技术生成

一、功能概述

DefaultMessageStore是RocketMQ底层存储对外层提供服务的窗口,它通过组织CommitLog、ConsumeQueue、IndexFile来完成RocketMQ存储的功能。本篇分析DefaultMessageStore提供的功能和启动过程的源码实现。

二、源码分析

1、MessageStore存储接口

首先,我们看一下DefaultMessage提供的功能窗口,DefaultMessageStore实现了MessageStore接口,MessageStore定义的接口大概可以分为以下几类:
MessageStore方法分类

2、DefaultMessageStore成员变量

    private final MessageStoreConfig messageStoreConfig;
    // CommitLog
    private final CommitLog commitLog;

    private final ConcurrentMap<String/* topic */, ConcurrentMap<Integer/* queueId */, ConsumeQueue>> consumeQueueTable;

    // 负责ConsumeQueue刷盘
    private final FlushConsumeQueueService flushConsumeQueueService;

    // 负责清理过期的CommitLog文件
    private final CleanCommitLogService cleanCommitLogService;

    // 负责清理过期的ConsumeQueue文件
    private final CleanConsumeQueueService cleanConsumeQueueService;

    private final IndexService indexService;

    // 负责MappedFile的创建
    private final AllocateMappedFileService allocateMappedFileService;

    // 负责消息重放(通知ConsumeQueue和indexFile创建对应的索引、通知pull消息请求消息到达)
    private final ReputMessageService reputMessageService;

    // 负责消息的主从备份
    private final HAService haService;

    // 负责处理延迟消息队列
    private final ScheduleMessageService scheduleMessageService;

    // 负责打印当前存储状态
    private final StoreStatsService storeStatsService;

    // 直接内存暂存池
    private final TransientStorePool transientStorePool;

    private final RunningFlags runningFlags = new RunningFlags();
    private final SystemClock systemClock = new SystemClock();

    private final ScheduledExecutorService scheduledExecutorService =
        Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl("StoreScheduledThread"));
    private final BrokerStatsManager brokerStatsManager;
    private final MessageArrivingListener messageArrivingListener;
    private final BrokerConfig brokerConfig;

    private StoreCheckpoint storeCheckpoint;

    private final LinkedList<CommitLogDispatcher> dispatcherList;

	//省略了部分成员变量	

首先,DefaultMessageStore存储依赖三类文件:CommitLog、ConsumeQueue、IndexFile。

一个DefaultMessageStore持有一个CommitLog对象。

ConsumeQueue是以一个Map嵌套Map组织的,每个topic下的每个queue都对应一个ConsumeQueue,用来索引改Queue下消息在CommitLog中的位置。

IndexFile是由IndexService提供服务的,IndexService持有一个IndexFile的List。

DefaultMessageStore持有了一些Service对象:
Service
这里只列出来各个Service的功能,具体实现会在后续文章中分析。

DefaultMessageStore还持有一个比较重要的对象:MessageArrivingListener。MessageArrivingListener作为一个消息到达的监听器,在消息写入后,会通知消息到达,触发向拉取消息的客户端写入数据。

3、DefaultMessageStore启动过程

DefaultMessageStore进入正常工作之前,需要经过创建对象、load、start这三个步骤。

DefaultMessageStore只有一个构造方法,其执行内容就是给一些成员变量赋值,并且调用了AllocateMappedFileService、IndexService的start()方。IndexService的start()方法是空的,没有什么内容。AllocateMappedFileService调用start()后,会创建一个线程,定时从队列中获取创建MappedFile文件的请求,然后根据请求内容创建MappedFile。关于MappedFile的内容,我们在前面分析CommitLog的文章中有分析过,这里不再解释。

创建完DefaultMessageStore后,需要做调用load()方法,load()方法的作用主要是从磁盘中加载CommitLog、ConsumeQueue、storeCheckpoint对象,并且恢复CommitLog,构建成员变量consumeQueueTable。下面是具体实现细节:

    public boolean load() {
   
        boolean result = true;
        try {
   
        	// 通过temp文件判断上次退出是否是正常退出
            boolean lastExitOK = !this.isTempFileExist();
            log.info("last shutdown {}", lastExitOK ? "normally" : "abnormally");
            if 
RocketMQ 是一个开源的分布式消息中间件系统,它归属于 Apache 开源软件基金会。RocketMQ 主要用于解决异步消息通信的问题,可以支持高性能、高可靠的消息传递。 RocketMQ 的整体架构包括了四个核心组件:名称服务器(Name Server)、消息 Broker(Message Broker)、生产者(Producer)和消费者(Consumer)。 名称服务器(Name Server)的主要功能是注册和管理 Broker、Producer 和 Consumer,它负责维护整个 RocketMQ 的注册表。Producer 和 Consumer 在启动时会向名称服务器注册自己的信息,并且周期性地向名称服务器发送心跳,以保持注册信息的有效性。此外,名称服务器还负责将 Producer 发送的消息路由到相应的 Broker。 消息 Broker(Message Broker)是一个消息存储和转发的节点,它接收来自 Producer 的消息并持久化存储,并根据订阅关系将消息转发给 Consumer。RocketMQ 支持顺序消息和广播消息两种模式,顺序消息可以按照指定的顺序进行消费,广播消息则会被所有的 Consumer 所接收。 生产者(Producer)可以将消息发送到 Broker,生产者可以设置消息的发送模式、发送延迟等属性。在发送消息时,RocketMQ 会将消息存储在 Broker 中,并返回发送结果给生产者,生产者可以根据发送结果进行相应的处理。 消费者(Consumer)可以订阅和消费 Broker 中的消息,消费者可以按照一定的模式从 Broker 中订阅消息,并根据自己的需求进行消费。消费者可以设置消费模式、消费线程数等参数。 总的来说,RocketMQ 是一个功能强大、高性能、高可靠的分布式消息中间件系统,可以广泛应用于各种场景,如电子商务、大数据分析、日志处理等。它具有良好的水平扩展性和高吞吐量,能够满足大规模系统的消息通信需求。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值