系列
rocketMq概念介绍
rocketMq-namesrv介绍
rocketMq-Topic创建过程
rocketMq-producer介绍
rocketMq-consumer介绍
rocketMq - rebalance介绍
rocketMq - 并发消费过程
rocketMq - 串行消费过程
rocketMq-broker介绍
rocketMq-broker消息存储介绍
rocketMq - commitLog
rocketMq - index介绍
rocketMq-延迟消息介绍
rocketMq-事务消息介绍
rocketMq消息查询
rocketMq和kafka的架构区别
rocketMq - master/slave同步
说到rocketMq的consumer,该篇文章特指pushConsumer,pullConsumer在后续文章中在分享。
提到consumer,需要搞清楚几个核心问题,分别是consumer的初始化过程做了哪些事情,消息是如何消费,consumer如何动态平衡的,整个逻辑还是比较绕的,其中这章节主要会讲清楚两个事情,1、初始化过程中client做了哪些事情;2、consumer如何动态平衡拉取任务,具体的任务消费会由额外的一章进行讲解。
consumer的初始化过程
说明:整体执行过程如下,着重介绍subscribe和start两个过程
1、创建consumer并设置消费分组
2、设置消费位移
3、设置订阅topic
4、设置消费执行的回调函数
5、启动consumer
consumer的初始化流程图
consumer内部初始化过程
说明:整个初始化比较复杂,为了大家能够理解,先用简单的语句概述一遍
1、构建consumer的订阅信息,包括consumer本身的订阅和消费分组的重试队列。
2、创建Rebalance服务,该服务每隔20s进行消费端负责的messageQueue的消费。
3、启动消费偏移量获取服务,获取上一次消费位移。
4、启动定时任务,其中核心任务之一是定时去namesrv拉取broker信息。
5、启动pullMessageService,负责从broker拉取待消费消息
6、启动rebalanceService,负责定期调整consumer端负载均衡包括第一次触发拉取任务
7、其中rebalanceService和pullMessageService相互配合使用,前者负责将新加入messageQueue拉取任务加入到pullMessageservice当中,将旧的messageQueue的拉取任务从pullMessageService中停止,两者之间通过消息队列的形式进行通信。
构建subscription过程
说明:参见DefaultMQPushConsumerImpl类
1、订阅消息最后保存至RebalanceImpl当中,因为这个是后面动态负载均衡的核心。
client端启动过程
说明:参见DefaultMQPushConsumerImpl类
说明:参见DefaultMQPushConsumerImpl类
1、启动了获取消费进度的服务
说明:参见MQClientInstance类
1、启动定时任务,主要是从namsrv中拉取broker的信息
2、启动client从broker拉取消息的服务
3、启动Rebalance服务,负责触发消息拉取的任务
4、步骤3和步骤4之间的两个服务通过消息队列通信
说明:参见MQClientInstance类
1、负责从namesrv拉取broker的信息
拉取任务的执行过程
说明:参见PullMessageService类
1、负责从pullRequestQueue中获取拉取任务并执行,该任务由Rebalance服务投递
拉取任务的生成过程
说明:参见RebalanceService类
1、consumer端负载均衡的入口
说明:参见MQClientInstance类
1、每个consumer客户端只会有一个对象,所以这里for循环只有一次。
说明:参见MQClientInstance类
1、针对每个订阅信息都进行动态负责均衡,包括consumer本身的订阅分组和consumerGroup的重试分组。
说明:参见RebalanceImpl类
1、动态负载均衡就是一个topic下所有的messageQueue和消费分组里面的消费者按照一定的动态调整策略进行分配,同一个消费分组里面的消费者每人负责一部分的messageQueue。
说明:参见RebalanceImpl类
1、consumer新负责的messageQueue加入到拉取任务当中来
2、consumer不负责的messageQueue从拉取任务中剔除。
说明:参见PullMessageService类
说明:参见PullMessageService类
订阅重试队列逻辑
说明:
核心代码逻辑,这个表明了consumer订阅了重试队列并对重试队列进行消费。