你的RocketMQ双主集群可能是个假的

问题现象

RocketMQ部署的双主双从集群,Topic_Test1只存在于其中一台主节点broker-a上,从而该Topic发送的消息只会发送到了broker-a节点,另一台主节点broker-b等于是"隔岸观火"没有发挥任何作用。

问题分析

我们在发送Topic_Test1主题消息时,MQ集群里并存在Topic_Test1这个主题,Broker参数autoCreateTopicEnable默认为true,会自动创建不存在的Topic。

这里补充一下RocketMQ路由获取规则的知识:

  1. Broker 在启动时会向 Nameserver 注册其存储的路由信息,并持续每30秒发送心跳包,同时更新路由信息。
  2. Nameserver 则每10秒扫描一次路由表。一旦发现 Broker 服务出现故障,对应的路由信息将被移除。
  3. 消息生产者每30秒会从 Nameserver 重新获取 Topic 的路由信息,并更新其本地路由表。在发送消息之前,如果本地路由表中缺少特定主题的路由信息,生产者会主动从 Nameserver 拉取该主题的消息。 现在生产者在发送消息的时候,肯定是获取不到这个未创建Topic的路由信息的,那么它会如何处理呢?

源码

没有什么是比源码更能说明问题的,我们直接看源码吧。 RocketMQ版本:5.1.0 既然是双主集群,那么两台主Broker应该都会创建这个默认主题的,我们继续看生产者是如何发送这个Broker上不存在的Topic信息发送出去的吧。 这里只有一个默认的Topic信息,后面会自动创建Topic_Test1主题的路由信息 默认的主题在两台主节点都存在,这里选择其中一个队列 我们继续看服务端是如何处理这个消息的 服务端发现主题不存在后,会自动创建,等下次往Nameserver发送路由心跳的时候,就会带上这个自动创建的主题信息。而当前因为发送的消息量比较少,另一台主节点此时还是没有Topic_Test1这个主题的,后续发送方从Nameserver处获取到的Topic_Test1主题的路由信息只有其中一个主节点队列,导致无论再发多少条消息,都只会发往其中一台主节点。

到这里,问题已经很清晰了,我们再做个实验验证一下,一次发送10条消息(超过8条)。

总结:

生产环境中,一定要关闭自动创建主题(autoCreateTopicEnable=false),当业务需要新建主题时,选择手动创建,如果不关闭,在第一次发送消息量比较少时,则可能出现某个主节点无该主题。

相关推荐
KYGALYX9 小时前
服务异步通信
开发语言·后端·微服务·ruby
掘了9 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
爬山算法9 小时前
Hibernate(90)如何在故障注入测试中使用Hibernate?
java·后端·hibernate
kfyty72510 小时前
集成 spring-ai 2.x 实践中遇到的一些问题及解决方案
java·人工智能·spring-ai
猫头虎10 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
李少兄10 小时前
在 IntelliJ IDEA 中修改 Git 远程仓库地址
java·git·intellij-idea
Moment10 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
忆~遂愿10 小时前
ops-cv 算子库深度解析:面向视觉任务的硬件优化与数据布局(NCHW/NHWC)策略
java·大数据·linux·人工智能
小韩学长yyds10 小时前
Java序列化避坑指南:明确这4种场景,再也不盲目实现Serializable
java·序列化
仟濹10 小时前
【Java基础】多态 | 打卡day2
java·开发语言