源码分析RocketMQ之Producer-获取topic路由信息

源码分析RocketMQ之Producer-获取topic路由信息
tryToFindTopicPublishInfo 获取topic路由信息,如果获取不到或者状态不正确,则从NameServer获取一次
方法主要在类DefaultMQProducerImpl 中调用
    1、sendDefaultImpl 发送消息,发送之前需要进行路由信息获取
    2、sendKernelImpl 执行forbidden、sendBefore、sendAfter的hook 封装了发送消息的远程请求
    3、sendSelectImpl 发送消息,可以选择路由队列
    4、prepareSendRequest 以同步模式发送请求消息,准备发送消息请求
1、topicPublishInfoTable 缓存中先获取Topic路由发布信息
2、如果缓存获取不到,updateTopicRouteInfoFromNameServer从Namesrv获取一次
 updateTopicRouteInfoFromNameServer 
  1、topic 主题 isDefault 消费者 false 生产者 true defaultMQProducer 消费者 null ,生产者 对应实例
  2、获取nameserver锁
  3、生产者获取路由信息,或者默认主题从NameServer获取路由信息 getTopicRouteInfoFromNameServer
    1、创建路由信息的请求头 GetRouteInfoRequestHeader RequestCode.GET_ROUTEINFO_BY_TOPIC 请求
    2、创建请求命令,请求实体 RemotingCommand
    3、同步调用获取结果 我们有多个nameserv ,比如说我们有3台nameserv ,那么生产者是找谁获取的呢?
  4、消费者使用指定主题从NameServer获取路由信息
  5、路由信息不为空,判断是否更新,更新本地缓存
    1、topicRouteDataIsChange  判断路由信息是否变更,如果对象的每个属性值equals未变,未变更
    2、topicRouteData2TopicPublishInfo 更新TopicPublishInfo
      1、创建路由对象
      2、关联Topic路由
      3、顺序消息,更新TopicPublishInfo,循环获取到broker的nums,创建MessageQueue
      4、非顺序消息更新TopicPublishInfo
         1、获取非顺序消息更新List<QueueData>
         2、根据brokerName排序
         3、遍历topic队列信息、判断是否写队列,遍历队列Broker,据名称获得读队列对应的Broker
         4、未获取继续,如果非master节点继续下次循环
         5、匹配到的信息封装TopicPublishInfo写队列
      5、设置非顺序消息标识
3、如果获取的Topic路由信息可用,则返回
4、如果未找到当前主题的路由信息,则用默认主题从Namesrv继续查找

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值