-
- 1、RocketMQ 推拉模式简介
-
2、DefaultMQPullConsumer 核心属性
-
3、消息消费者启动流程分析
消费者与消息存储方 Broker一般有两种通信机制:推(PUSH)、拉(PULL)。
-
推模式:消息发送者将消息发送到Broker,然后Broker主动推送给订阅了该消息的消费者。
-
拉模式:消息发送者将消息发送到Broker上,然后由消息消费者自发的向Broker拉取消息。
RocketMQ 推拉机制实现:严格意义上来讲,RocketMQ 并没有实现 PUSH 模式,而是对拉模式进行一层包装,在消费端开启一个线程 PullMessageService 循环向 Broke r拉取消息,一次拉取任务结束后马上又发起另一次拉取操作,实现准实时自动拉取,PUSH 模式的实现请参考如下博文:
本文重点在讨论RocketMQ拉模式DefaultMQPullConsumer实现。
RocketMQ 拉模式,RocketMQ 消费者不自动向消息服务器拉取消息,而是将控制权移交给应用程序,RocketMQ消费者只是提供拉取消息API。
为了对 RocketMQ 拉模式有一个直观的了解,我们先大概浏览一下 MQPullConsumer 接口。
从上面我们可以看到除了启动、关闭,注册消息监听器,其他的就是针对 MessageQueue 拉取消息,特别值得留意的是每一个拉取 pull 方法,都是直接针对消息消费队列。PUSH 模式可以说基于订阅与发布模式,而PULL模式可以说是基于消息队列模式。
特别说明:PULL模式根据主题注册消息监听器,这里的消息监听器,不是用来消息消费的,而是在该主题的队列负载发生变化时,做一下通知。
我们应该带着我们对 PUSH 模式的相关知识来认识一下 PULL 模式,对比学习.
PUSH模式主要知识点:
-
消息拉取机制:PullMessageServer线程 根据PullRequest拉取任务循环拉取。
-
消息队列负载机制,按照消费组,对主题下的消息队列,结合当前消费组内消费者数量动态负载。
按照上面API的描述,PULL模式应该无需考虑上面两个情形,我们带着上述疑问,开始我们今天的学习。
/**
-
Do the same thing for the same Group, the application must be set,and
-
guarantee Globally unique
*/
private String consumerGroup;
/**
-
Long polling mode, the Consumer connection max suspend time, it is not
-
recommended to modify
*/
private long brokerSuspendMaxTimeMillis = 1000 * 20;
/**
-
Long polling mode, the Consumer connection timeout(must greater than
-
brokerSuspendMaxTimeMillis), it is not recommended to modify
*/
private long consumerTimeoutMillisWhenSuspend = 1000 * 30;
/**
- The socket timeout in milliseconds
*/
private long consumerPullTimeoutMillis = 1000 * 10;
/**
- Consumption pattern,default is clustering
*/
private MessageModel messageModel = MessageModel.CLUSTERING;
/**
- Message queue listener
*/
private MessageQueueListener messageQueueListener;
/**
- Offset Storage
*/
private OffsetStore offsetStore;
/**
- Topic set you want to register
*/
private Set registerTopics = new HashSet();
/**
- Queue allocation algorithm
*/
private AllocateMessageQueueStrategy allocateMessageQueueStrategy = new AllocateMessageQueueAveragely();
/**
- Whether the unit of subscription group
*/
private boolean unitMode = false;
private int maxReconsumeTimes = 16;
-
consumerGroup : 消费组名称.
-
brokerSuspendMaxTimeMillis :长轮询模式下挂起的最大超时时间,在Broker端根据偏移量从存储文件中查找消息时如果返回 PULL_NOT_FOUND时,不理解返回给拉取客户端,而是交给PullRequestHoldService线程,每隔5秒再去拉取一次消息,如果找到则返回给消息拉取客户端,否则超时。
-
consumerTimeoutMillisWhenSuspend : 整个消息拉取过程中,拉取客户端等待服务器响应结果的超时时间,默认30s
-
consumerPullTimeoutMillis :默认10s,拉消息时建立网络连接的超时时间
-
messageModel :消费模式,广播、集群
-
messageQueueListener : 业务消息监听器
-
OffsetStore :消息消费进度管理器
-
registerTopics :注册主题数
-
allocateMessageQueueStrategy :队列分配器
-
maxReconsumeTimes :最大消息重试次数,默认16次
DefaultMQPullConsumerImpl#start
public synchronized void start() throws MQClientException {
switch (this.serviceState) {
case CREATE_JUST:
this.serviceState = ServiceState.START_FAILED;
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
最后
本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们
目录:
Java面试核心知识点
一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!
Java面试核心知识点
已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了
[外链图片转存中…(img-I68saZ4Z-1711179076652)]
Java面试核心知识点
一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!
[外链图片转存中…(img-XmmiTaUp-1711179076653)]
Java面试核心知识点
已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了
[外链图片转存中…(img-QWLYEPnk-1711179076653)]