rocketMQ的Namesrv 源码分析(2)

本文深入探讨 RocketMQ Namesrv 的路由发现机制,客户端如何主动拉取路由信息以及在什么情况下进行更新。当Broker下线时,Namesrv 如何及时更新路由信息并清理相关数据结构。通过源码分析,展现了简洁明了的代码设计。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

路由发现

上篇讲到 路由信息在 namesrv 上注册好了,没有客户端使用怎么行呢。

rocketmq 的 namesrv 不会主动推送topic 的路由到客户端,而是由客户端主动拉取最新的路由信息。这里有一个问题:客户端会在哪些情况下去 namesrv 拉取路由信息,并且拉取的topic 路由信息是陈旧时,如何切换 namesrv 去重新拉取呢?producer 分析见

客户端一般是按照使用的 topic 去拉取的,请求的消息类型为RequestCode.GET_ROUTEINFO_BY_TOPIC,主要的实现类在RouteInfoManager#pickupTopicRouteData类中。获取结果为TopicRouteData对象,其包括如下内容:

private String orderTopicConf; //顺序消息配置信息,存放在 KVConfig 中
private List<QueueData> queueDatas; // topic 的massage Queue
private List<BrokerData> brokerDatas; //topic 所在的 broker数据
private HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable; //消息过滤服务器地址列表

具体消息的获取代码摘录摘录如下:

    public TopicRouteData pickupTopicRouteData(final String topic) {
   
        TopicRouteData topicRouteData = new TopicRouteData();
        //... 其他topicRouteData子对象的初始化
        try {
   
            try {
   
                this.lock.readLock().lockInterruptibly();
                //获取 topic 的 message Queue
                List<QueueData> queueDataList = this.topicQueueTable.get(topic);
                if (queueDataList != null) {
   
                    topicRouteData.setQueueDatas(queueDataList);
                    foundQueueData = true;

                    Iterator<QueueData> it = queueDataList.iterator();
                    while (it.hasNext()) {
   
                        QueueData qd = it.next();
                        //依次添加Queue 上 所有的 brokerName
                        brokerNameSet.add(qd.getBrokerName());
                    }
                    //再根据brokerName 获取 broker 地址信息以及消息过滤器
                    for (String brokerName : brokerNameSet) {
   
                        BrokerData brokerData = this.brokerAddrTable.get(brokerName);
                        if (null != brokerData) {
   
                            BrokerData brokerDataClone = new BrokerData(brokerData.getCluster(), brokerData.getBrokerName()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值