GitHub user Silencesk closed a discussion: 动态新增namesrv节点,导致客户端消息发送失败,No route info of this topic
# 背景 * rocketmq:4.9.4,master-slave架构部署 * 在客户端Producer使用WSAddr(rocketmq.namesrv.domain/rocketmq.namesrv.domain.subgroup)来进行namesrv地址的动态刷新,这样可以发现新增的namesrv节点 * 客户端Producer以2000 tps发送消息 * namesrv节点node1、node2。**需要增加一个node3节点,并且要将node1移除** # 问题 * 当我新增node3、并且移除掉node1之后 * 此时Producer出现了消息发送失败,异常为 **No route info of this topic** # 原因 * 排查过程中,发现在我新增node3、并且移除掉node1之后,正在运行的Producer连接的namesrv节点为node3,即连接到了新增的namesrv节点 * 同时观测到**topic route info changed**信息 2023-10-11 11:01:29.839 INFO [] [Share_MQClientFactoryScheduledThread_1] RocketmqClient 100: the topic[dev%fake-topic] **route info changed**, **old**[TopicRouteData [orderTopicConf=null, queueDatas=[QueueData [brokerName=dev%dev, readQueueNums=4, writeQueueNums=4, perm=6, topicSysFlag=0]], brokerDatas=[BrokerData [brokerName=dev%dev, brokerAddrs={**0=10.1.1.1:10911, 405=10.1.1.2:10911**}]], filterServerTable={}]] ,**new**[TopicRouteData [orderTopicConf=null, queueDatas=[QueueData [brokerName=dev%dev, readQueueNums=4, writeQueueNums=4, perm=6, topicSysFlag=0]], brokerDatas=[BrokerData [brokerName=sz-sk%dev%dev, brokerAddrs={**405=10.1.1.2:10911**}]], filterServerTable={}]] * 从路由变更日志可以看到,新的route info只有broker从节点(405=10.1.1.2:10911),并没有broker主节点(0=10.1.1.1:10911) * 这意味着,在从新增node3获取路由时,broker master还没有成功注册到namesrv,但slave已经注册了 * 客户端路由信息比对,是认为发生变化的,便进行了路由信息替换,此时的路由信息实际上是不可用的,因为就只有从节点 * 最终导致了消息发送失败,影响可用性 # 建议 考虑增强客户端Producer现有**路由信息的推空保护**能力 * 目前rocketmq-client定时更新topic route info逻辑,有对从namesrv返回null值做特别处理,但对于上述**无主节点broker的topic**并没有保护措施 * 可以考虑对namesrv返回的topicRouteData再做一次校验,如果发现**topicRoute为无效数据**(验证是否存在有效的messageQueue),则不进行替换,只作用到Producer。 如果该建议被采纳,我会提交PR。 GitHub link: https://github.com/apache/rocketmq/discussions/7448 ---- This is an automatically sent email for dev@rocketmq.apache.org. To unsubscribe, please send an email to: dev-unsubscr...@rocketmq.apache.org