RocketMQ Consumer源码阅读
在分布式消息系统中,RocketMQ以其高性能和可靠性赢得了广泛的关注和应用。本文将通过对RocketMQ Consumer源码的阅读,详细解析其内部机制和工作原理,帮助读者深入理解RocketMQ的消费流程。
一、概述
RocketMQ的消费者主要分为推模式消费者(DefaultMQPushConsumer)和拉模式消费者(DefaultMQPullConsumer)。推模式消费者由Consumer和Broker之间的长轮询实现。而拉模式消费者则需要主动从Broker拉取消息。本文将重点分析推模式消费者的源码。
二、核心类及关系
RocketMQ的消费者源码中,有几个核心类构成了其主要的框架:
- MQConsumer:定义了消费者的核心方法,包括启动(start)、关闭(shutdown)和注册消息监听器(registerMessageListener)。
- DefaultMQPushConsumer:实现了消息推模式消费,支持并发和顺序消费。它包含了一个DefaultMQPushConsumerImpl实例,用于具体的消费逻辑。
- RebalanceService:负责消费者的负载均衡,分配消息队列,并触发重平衡。
- ConsumeMessageService:负责消费消息,并将消息分发给具体的消息监听器进行处理。
三、消费者启动流程
消费者的启动流程主要包括以下几个步骤:
- 检查配置参数:在启动之前,消费者会检查其配置参数是否合法。
- 初始化MQClientInstance:消费者会初始化一个MQClientInstance实例,用于与Broker进行通信。
- 注册消费者到MQClientInstance:将消费者注册到MQClientInstance中,以便进行后续的消息消费。
- 启动负载均衡服务:启动RebalanceService,负责消费者的负载均衡和消息队列的分配。
- 启动消费服务:启动ConsumeMessageService,负责具体的消息消费逻辑。
四、消息消费模式
RocketMQ支持两种消息消费模式:推模式和拉模式。
推模式(Push)
推模式的特点是由Broker主动推送消息到Consumer。但实际上,这种推送是基于长轮询实现的。当Consumer启动后,它会向Broker发送一个拉取消息的请求,并等待Broker的响应。如果Broker有消息,就会立即将消息推送给Consumer;如果没有消息,Consumer会等待一段时间(长轮询时间)后再重新发送拉取请求。处理类DefaultMQPushConsumerImpl
服务端在
PullRequestHoldService ountDownLatch2阻塞住线程直到超时,ountDownLatch2比ountDownLatch多了reset方法。
在
ServiceThread里面定义了waitPoint和hasNotified
GroupCommitService是CommitLog的内部类当有新的消息写commitlog会修改hasNotified状态并通知等待的线程
推模式的消费流程如下:
- Broker推送消息:Broker检测到有新消息时,会主动将消息推送给Consumer。当请求线程被放开会循环
pullRequestTable通知。 - Consumer处理消息:Consumer接收到消息后,会将其交给
ConsumeMessageService进行处理。ConsumeMessageService会根据消息的类型(并发消费或顺序消费)将其分发给相应的消息监听器。
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来提高消费速度。