你的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),当业务需要新建主题时,选择手动创建,如果不关闭,在第一次发送消息量比较少时,则可能出现某个主节点无该主题。

相关推荐
x***3816几秒前
比较Spring AOP和AspectJ
java·后端·spring
v***5653 分钟前
【wiki知识库】07.用户管理后端SpringBoot部分
spring boot·后端·状态模式
CoderYanger5 分钟前
递归、搜索与回溯-记忆化搜索:40.矩阵中的最长递增路径
java·线性代数·算法·leetcode·矩阵·1024程序员节
3***C7445 分钟前
Spring Boot 集成 MyBatis 全面讲解
spring boot·后端·mybatis
Zfox_7 分钟前
【Go】结构体、自定义类型与接口
开发语言·后端·golang
万邦科技Lafite8 分钟前
淘宝拍立淘接口item_search_img实战应用指南
java·商品信息·开放api·电商开放平台
予辉安全8 分钟前
JAVA代码审计:鉴权漏洞深度分析
java
星释9 分钟前
Rust 练习册 101:字符串序列切片的艺术
开发语言·后端·rust
r***R28911 分钟前
Spring Boot3.3.X整合Mybatis-Plus
spring boot·后端·mybatis
q_191328469512 分钟前
基于SpringBoot+uniapp+vue.js的货物配送系统
java·vue.js·spring boot·后端·mysql·uni-app·毕业设计