源码分析RocketMQ消息拉取拉模式PULL,让我成功在寒冬中站稳脚步

    • 1、RocketMQ 推拉模式简介
  • 2、DefaultMQPullConsumer 核心属性

  • 3、消息消费者启动流程分析

1、RocketMQ 推拉模式简介


消费者与消息存储方 Broker一般有两种通信机制:推(PUSH)、拉(PULL)。

  • 推模式:消息发送者将消息发送到Broker,然后Broker主动推送给订阅了该消息的消费者。

  • 拉模式:消息发送者将消息发送到Broker上,然后由消息消费者自发的向Broker拉取消息。

RocketMQ 推拉机制实现:严格意义上来讲,RocketMQ 并没有实现 PUSH 模式,而是对拉模式进行一层包装,在消费端开启一个线程 PullMessageService 循环向 Broke r拉取消息,一次拉取任务结束后马上又发起另一次拉取操作,实现准实时自动拉取,PUSH 模式的实现请参考如下博文:

  1. 推模式消息拉取机制

  2. 推模式消息队列负载机制

本文重点在讨论RocketMQ拉模式DefaultMQPullConsumer实现。

RocketMQ 拉模式,RocketMQ 消费者不自动向消息服务器拉取消息,而是将控制权移交给应用程序,RocketMQ消费者只是提供拉取消息API。

为了对 RocketMQ 拉模式有一个直观的了解,我们先大概浏览一下 MQPullConsumer 接口。

这里写图片描述

从上面我们可以看到除了启动、关闭,注册消息监听器,其他的就是针对 MessageQueue 拉取消息,特别值得留意的是每一个拉取 pull 方法,都是直接针对消息消费队列。PUSH 模式可以说基于订阅与发布模式,而PULL模式可以说是基于消息队列模式。

特别说明:PULL模式根据主题注册消息监听器,这里的消息监听器,不是用来消息消费的,而是在该主题的队列负载发生变化时,做一下通知。

我们应该带着我们对 PUSH 模式的相关知识来认识一下 PULL 模式,对比学习.

PUSH模式主要知识点:

  • 消息拉取机制:PullMessageServer线程 根据PullRequest拉取任务循环拉取。

  • 消息队列负载机制,按照消费组,对主题下的消息队列,结合当前消费组内消费者数量动态负载。

按照上面API的描述,PULL模式应该无需考虑上面两个情形,我们带着上述疑问,开始我们今天的学习。

2、DefaultMQPullConsumer 核心属性


/**

  • 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次

3、消息消费者启动流程分析


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开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

最后

本人也收藏了一份Java面试核心知识点来应付面试,借着这次机会可以送给我的读者朋友们

目录:

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

全靠这套面试题,才让我有惊无险美团二面拿offer  (面经解析)

[外链图片转存中…(img-I68saZ4Z-1711179076652)]

Java面试核心知识点

一共有30个专题,足够读者朋友们应付面试啦,也节省朋友们去到处搜刮资料自己整理的时间!

[外链图片转存中…(img-XmmiTaUp-1711179076653)]

Java面试核心知识点

已经有读者朋友靠着这一份Java面试知识点指导拿到不错的offer了

[外链图片转存中…(img-QWLYEPnk-1711179076653)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 25
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值