RocketMQ源码学习 (十一) 消费者-并发消费服务原理学习

本文回顾了RocketMQ拉消息流程,消费者通过Rebalance对象计算分配队列,创建PullRequest发起网络请求拉取消息,拉到消息后提交到消费服务。还介绍了并发消息消费,涉及消费者门面、消息监听器等组件,以及消费任务线程池、调度线程池等的作用和相关处理逻辑。

1 拉消息流程回顾

在学习消息是如何被消费的原理之前,我们去回顾之前拉取消息的流程。
首先,消费者实现类DefaultMQPushConsumerImpl里面有Rebalance对象,其触发的时机是在客户端实例里面的RebalanceService服务,RebalanceService有自己的线程资源,每二十秒执行一次doRebalance方法,该方法会调用RebalanceImpl的doRebalance方法,根据消费者所订阅的主题去计算出来分配给当前消费者的队列,并为该队列创建ProcessQueue(Broker端的队列在消费者端的快照,后文简称PQ),再为PQ创建PullRequest对象,将PullRequest交给PullMessageService,该服务里面的run方法基于PullRequestQueue作take操作,然后调用该消费者的pullMessage方法,传递PullRequest对象。pullMessage方法会创建PullCallback(最终处理服务器端返回的消息结果的),然后发起网络请求到broker,broker会根据请求参数查询消息封装到response对象,客户端接收到消息之后就将消息转成PullResultExt对象,将该对象交给PullCallback,PullCallback拿到该对象之后执行PullAPIWrapper.processPullresult预处理方法(该方法的流程:会根据PullResultExt里保存的suggestWhichBrokerId推荐主机id到本地的推荐映射表,将PullResultExt里的二进制数组messageBinary解析出来为msg的List,然后消费者本地的过滤,然后保存到msgFoundList)。预处理之后会根据pullStatus进行相对应的处理(见前文),pullStatus==FOUND为成功拉取到消息,然后会更新PullRequest对象的nextOffset(下次拉消息的offset),将拉取到的消息msg保存到PQ快照中,然后将msg、PQ和messageQueue一起提交到ConsumerMessageService消费服务,消费服务会提交到线程池进行消息的消费。
本篇文章内容主要针对

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值