rocketmq源码-consumer拉取消息(push模式)

本文深入探讨RocketMQ消费者在Push模式下如何拉取消息,包括同步请求、异步发送请求的流程,以及顺序消费和平行消费的实现细节。文章分析了PullMessageService、DefaultMQPushConsumerImpl等关键类的源码,揭示了消息拉取、处理和回调的完整过程。

前言

在前面consumer启动的博客中,有说过,在启动过程中,有两个比较重要的逻辑,分别是负载均衡和拉取消息的service,这篇博客,主要记录拉取消息的service,因为前面的demo和这篇笔记中的demo,都是基于push模式来学习的,所以前面的笔记都是基于push模式的,但是最近看了下pull模式,和push模式的代码还是有点区别的,所以后面单独起一篇博客,记录pull模式的逻辑

源码

org.apache.rocketmq.client.impl.consumer.PullMessageService#run

前面有说过,拉取消息,使用的是这个service,所以我们从这个service的入口处开始看起
这里会发现,只有两行代码

  1. 从一个queue中拉取到一个pullRequest请求体
  2. 然后调用pullMessage方法
    这里的这个queue很重要,这个queue中存放的是拉取消息的请求,会再调用pullMessage()方法拉取到消息,各个消费者处理完之后,再放到pullRequestQueue中一个请求,所以这里就会在本次拉取消息的请求完成之后,接着取pullRequest,再次触发拉取消息的请求

这里有一个很重要的逻辑:既然拉取消息的请求,是从pullRequestQueue中开始的,那在consumer启动之后,第一次拉取消息的pullRequest是什么放进队列里面的呢?因为这里看到只是去取数据,总要有一个地方,先放进去一个请求,才会开始拉取消息;第一次把pullRequest放到queue中,是在负载均衡分配了messageQueue之后,会构建pullRequest,然后把请求放到queue中,在后面负载均衡的service笔记中会记录
在这里插入图片描述</

RocketMQPushConsumer是一种消息消费者模式,它是基于模型的实现。尽管消息消费被称为Push,但实际上仍然是通过的方式来获取消。\[1\]在RocketMQ中,消费者有两种模式,一种是push模式,另一种是pull模式。在push模式中,当服务端有消息时,将消息推送到客户端。而在pull模式中,客户端需要不断轮询请求服务端来获新的消息。\[3\]不过,无论是push模式还是pull模式,实际上都是采用消费端主动的方式,即consumer轮询从broker取消。\[3\]在PushConsumer中,轮询过程被封装在内部,并通过注册MessageListener监听器来消费消息。当消息到达时,会唤醒MessageListener的consumeMessage()方法来进行消费,给用户一种消息被推送过来的感觉。\[3\]而在PullConsumer中,用户需要自己编写获取消的逻辑,首先通过打算消费的Topic获MessageQueue的集合,然后遍历MessageQueue集合,针对每个MessageQueue批量获取消,一次完后记录该队列下一次要的开始offset,直到完了再切换到另一个MessageQueue。\[3\]所以,PushConsumerRocketMQ中用于实现push模式消息消费的一种消费者。 #### 引用[.reference_title] - *1* [RocketMQ实战-初探PushConsumer限流机制实现原理](https://blog.youkuaiyun.com/Huangjiazhen711/article/details/127746551)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [rocketmq源码-consumer取消push模式)](https://blog.youkuaiyun.com/CPLASF_/article/details/128311025)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [rocketMQconsumerpush和pull模式](https://blog.youkuaiyun.com/qq_26896085/article/details/104958768)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down28v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值