RocketMQ——从NameServer更新客户端订阅的topic路由信息

本文详细解析了RocketMQ中如何通过MQClientInstance.updateTopicRouteInfoFromNameServer()方法,从NameServer获取并更新Producer和Consumer端的topic路由信息,包括TopicRouteData、MessageQueue的创建和管理,确保消息的正确投递与消费。
摘要由CSDN通过智能技术生成

由Producer或Consumer端调用MQClientInstance. updateTopicRouteInfoFromNameServer()方法的目的主要有:

1)从NameServer获取该客户端订阅的每个topic的相关信息(包括每个topic对应的Broker信息和topic配置信息),用TopicRouteData对象表示;并将该对象信息存入MQClientInstance.topicRouteTable变量中;

2)根据返回的信息更新topic对应的BrokerName和BrokerId,保存在变量 MQClientInstance.brokerAddrTable中;

3)对于Prodcuer,根据每个topic以及配置的写队列个数创建MessageQueue消费队列,并存入变量DefaultMQProducerImpl.topicPublishInfoTable中;

4)对于已经订阅了该topic的Consumer,根据每个topic以及配置的读队列个数创建MessageQueue消费队列,并存入变量RebalanceImpl. topicSubscribeInfoTable中;

大致逻辑如下:

1、获取Producer或Consumer端的所有topic列表,步骤如下:

1.1)对于PushConsumer端:遍历MQClientInstance.consumerTable:

ConcurrentHashMap<String/* group */, MQConsumerInner>变量,对于每个DefaultMQPushConsumerImpl(MQConsumerInner的子类),获取DefaultMQPushConsumerImpl.rebalanceImpl:RebalanceImpl变量中的RebalanceImpl.subscriptionInner:ConcurrentHashMap<String, SubscriptionData>变量的values值,即SubscriptionData的集合;然后遍历SubscriptionData集合,取出每个SubscriptionData对象的topic变量值,即构成了该PushConsumer端的所有topic列表;

1.2)对于PullConsumer端:遍历MQClientInstance.consumerTable:

ConcurrentHashMap<String/* group */, MQConsumerInner>变量,对于每个DefaultMQPullConsumerImpl(MQConsumerInner的子类),对应的DefaultMQPullConsumer.registerTopics的变量值集合构成了该PullConsumer端的所有to

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值