RocketMQ Consumer源码阅读笔记

106 阅读4分钟

RocketMQ Consumer源码阅读

在分布式消息系统中,RocketMQ以其高性能和可靠性赢得了广泛的关注和应用。本文将通过对RocketMQ Consumer源码的阅读,详细解析其内部机制和工作原理,帮助读者深入理解RocketMQ的消费流程。

一、概述

RocketMQ的消费者主要分为推模式消费者(DefaultMQPushConsumer)和拉模式消费者(DefaultMQPullConsumer)。推模式消费者由Consumer和Broker之间的长轮询实现。而拉模式消费者则需要主动从Broker拉取消息。本文将重点分析推模式消费者的源码。

二、核心类及关系

RocketMQ的消费者源码中,有几个核心类构成了其主要的框架:

  • MQConsumer:定义了消费者的核心方法,包括启动(start)、关闭(shutdown)和注册消息监听器(registerMessageListener)。
  • DefaultMQPushConsumer:实现了消息推模式消费,支持并发和顺序消费。它包含了一个DefaultMQPushConsumerImpl实例,用于具体的消费逻辑。
  • RebalanceService:负责消费者的负载均衡,分配消息队列,并触发重平衡。
  • ConsumeMessageService:负责消费消息,并将消息分发给具体的消息监听器进行处理。

三、消费者启动流程

消费者的启动流程主要包括以下几个步骤:

  1. 检查配置参数:在启动之前,消费者会检查其配置参数是否合法。
  2. 初始化MQClientInstance:消费者会初始化一个MQClientInstance实例,用于与Broker进行通信。
  3. 注册消费者到MQClientInstance:将消费者注册到MQClientInstance中,以便进行后续的消息消费。
  4. 启动负载均衡服务:启动RebalanceService,负责消费者的负载均衡和消息队列的分配。
  5. 启动消费服务:启动ConsumeMessageService,负责具体的消息消费逻辑。

四、消息消费模式

RocketMQ支持两种消息消费模式:推模式和拉模式。

推模式(Push)

推模式的特点是由Broker主动推送消息到Consumer。但实际上,这种推送是基于长轮询实现的。当Consumer启动后,它会向Broker发送一个拉取消息的请求,并等待Broker的响应。如果Broker有消息,就会立即将消息推送给Consumer;如果没有消息,Consumer会等待一段时间(长轮询时间)后再重新发送拉取请求。处理类DefaultMQPushConsumerImpl

image.png 服务端在PullRequestHoldService ountDownLatch2阻塞住线程直到超时,ountDownLatch2比ountDownLatch多了reset方法。

image.pngServiceThread里面定义了waitPointhasNotified image.png GroupCommitService是CommitLog的内部类当有新的消息写commitlog会修改hasNotified状态并通知等待的线程 image.png

image.png

image.png 推模式的消费流程如下:

  1. Broker推送消息:Broker检测到有新消息时,会主动将消息推送给Consumer。当请求线程被放开会循环pullRequestTable通知。 image.png
  2. Consumer处理消息:Consumer接收到消息后,会将其交给ConsumeMessageService进行处理。ConsumeMessageService会根据消息的类型(并发消费或顺序消费)将其分发给相应的消息监听器。

image.png

image.png 3. 更新消费进度ConsumeRequest就是一个任务,里面执行消息前后的hook,处理完消息通知Broker消息处理状态

拉模式(Pull)

拉模式则需要Consumer主动从Broker拉取消息。虽然RocketMQ主要使用的是推模式,但拉模式在某些场景下仍然有其优势。例如,当Consumer的处理能力较强,而Broker的消息量较小时,拉模式可以减少Broker的推送压力,提高系统的整体性能。

五、ConsumeQueue的作用

在RocketMQ中,除了CommitLog文件用于持久化存储消息外,还有一个ConsumeQueue文件用于提高消费者的消费速度。ConsumeQueue是消费队列的索引文件,它记录了消息在CommitLog文件中的偏移量和队列ID等信息。消费者可以根据这些信息快速定位到需要消费的消息。

ConsumeQueue的构建是由Broker在启动时通过ReputMessageService完成的。ReputMessageService会定期读取CommitLog文件中的消息,并构建DispatchRequest对象。然后,这些DispatchRequest对象会被分发到不同的处理器中,其中一个处理器就是CommitLogDispatcherBuildConsumeQueue,它负责构建ConsumeQueue索引。ConsumeQueue的数量和Consumer是n:1,所以ConsumeQueue的数量限制了Consumer的消费能力不能无限的增加Consumer来提高消费速度。