RocketMQ——Consumer端自动地不间断地发起拉取消息的业务逻辑

对于Consumer订阅的topic实现自动拉取消息的两个场景:第一,PUSH模式下的消息消费;第二,PULL模式下的调度消费。在这两种场景下面定时的检查Consumer订阅的topic路由信息的变化,对初次订阅的topic或有变化的topic生成MessageQueue和ProcessQueue对象,并创建PullRequest对象放入拉取消息服务线程中,由该线程不间断地执行拉取消息的工作直到再次检测到ProcessQueue对象的dropped为true为止。

该RebalanceService服务线程的run方法中,每隔10秒钟就执行一次MQClientInstance.doRebalance()方法,在该方法中遍历MQClientInstance.consumerTable:ConcurrentHashMap<String/* group */, MQConsumerInner>变量,对每个MQConsumerInner对象,若是DefaultMQPushConsumerImpl(即PUSH模式)则执行RebalancePushImpl.doRebalance()方法,若是DefaultMQPullConsumerImpl(即PULL模式)则执行RebalancePullImpl.doRebalance()方法。

RebalancePushImpl和RebalancePullImpl类继承了RebalanceImpl抽象类。调用这两个子类的doRebalance方法,其实都是调用的抽象类RebalanceImpl的doRebalance方法。

在doRebalance方法中,首先获取RebalanceImpl. subscriptionInner:ConcurrentHashMap<String /* topic */, SubscriptionData>队列的Key值(即topic的集合),然后以每个topic值为参数调用RebalanceImpl.rebalanceByTopic(String topic)方法(详见1和2小节),该方法为topic所分配的MessageQueue创建ProcessQueue对象,并且创建拉取消息请求放入后台服务线程中自动执行拉取逻辑;待topic集合遍历完之后再调用RebalanceImpl.truncateMessageQueueNotMyTopic()方法,该方法的大致逻辑如下:

遍历RebalanceImpl.processQueueTable队列中的每个MessageQueue对象的topic,若该topic不在RebalanceImpl.subscriptionInner: ConcurrentHashMap<String /* topic */, SubscriptionData>列表中,则从RebalanceImpl.processQueueTable队列将该MessageQueue对象的记录删掉,然后置对应的ProcessQueue对象的dropped为true;

1 为topic下的所有MessageQueue创建拉取消息请求(广播模式下)

检查RebalanceImpl.messageModel变量,若等于BROADCASTING,则执行RebalanceImpl. rebalanceByTopic (String topic)方法中的广播模式下的逻辑,该方法的主要目的是为topic下的所有MessageQueue集合中的每个MessageQueue对象创建ProcessQueue对象,并且对于PUSH模式将拉取消息的请求放入服务线程(PullMessageService)中。大致逻辑如下:

1、以topic值为key值从RebalanceImpl.topicSubscribeInfoTable: ConcurrentHashMap<String/* topic */, Set<MessageQueue>>列表中获取MessageQueue集合;

2、以topic和上一步获得的MessageQueue集合为参数调用RebalanceImpl.updateProcessQueueTableInRebalance(String topic, Set<MessageQueue> mqSet)方法并获取返回结果。

3、若返回结果为true(即RebalanceImpl.processQueueTable列表有变化)则调用RebalanceImpl.messageQueueChanged(String topic, Set<MessageQueue> mqAll, Set<MessageQueue> mqDivided)方法;对于PUSH模式下面没有相应的处理逻辑,即messageQueueChanged方法为空;对于PULL模式下会调用RebalancePullImpl对象的messageQueueChanged方法,此方法的目的是对于采用了计划消息拉取服务的应用来说,当Consumer订阅的MessageQueue有变动或者或者ProcessQueue有更新时触发消息拉取动作,大致逻辑如下:

3.1)获取DefaultMQPullConsumer.messageQueueListener变量的值,该变量只有在应用层使用MQPullConsumerScheduleService类来进行计划拉取消息服务时才会设置MessageQueueListener对象;该对象是MQPullConsumerScheduleService类的内部类MessageQueueListenerImpl类的实例;

3.2)调用该内部类的实例MessageQueueListener对象的messageQueueChanged方法;

2 为Topic所分配每个MessageQueue创建拉取消息请求(集群模式下)

检查RebalanceImpl.messageModel变量,若等于CLUSTERING,则执行RebalanceI

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值