RocketMq 拉取数据流程源码分析
从一个问题开始
1、一个boker,一个主题,两个队列,一个消费者组,一个消费节点,此时两个队列是落在一个消费节点上,请问这个消费节点是如何拉取数据的?
需要明确关键对象之间的关系。
关键对象有:
1、RebalancePushImpl---》队列经过相关负载均衡算法,最终哪些队列落在当前节点上
2、DefaultMQPushConsumerImpl ----》当前节点向队列拉取数据
3、PullAPIWrapper ---》底层通过netty,向rocketmq服务器拉取数据,最终将数据存放在缓存队列中
4、PullMessageService ---》 循环从缓存队列中获取数据,并将数据分发给后面的处理线程池或单线程
org.apache.rocketmq.client.impl.consumer.RebalancePushImpl#dispatchPullRequest --->队列经过相关负载均衡算法,最终哪些队列落在当前节点上,保存在缓存队列中(此时一个节点有两个mq队列)
org.apache.rocketmq.client.impl.consumer.PullMessageService#run (关键)
--->定时从缓存队列中弹出 PullRequest(mq队列),
--->org.apache.rocketmq.client.impl.consumer.DefaultMQPushConsumerImpl#pullMessage (关键)向rocketmq服务器拉取某个mq队列的数据,
20240801
从线程维度进行观察:单线程拉取数据,再将数据分发给消费线程池去处理(并发模式)