源码分析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继续查找
源码分析RocketMQ之Producer-获取topic路由信息
最新推荐文章于 2025-03-19 07:30:00 发布