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

Reply via email to