rocketmq 自动创建topic源码分析

时间:2024-03-19 13:28:42

默认情况下,topic不用手动创建,当producer进行消息发送时,会从nameserver拉取topic的路由信息,如果topic的路由信息不存在,那么会默认拉取broker启动时默认创建好名为“TBW102”的Topic。

TBW102这个topic在自动创建队列中比较重要,开启自动创建topic的时候,会参照这个topic的创建配置创建,假如这个topic不存在,会无法创建。
TBW102 这个又是在哪里完成创建?这个会在broker启动时,随着会带上 topicConfigWrapper,这里面会包含需要默认创建的topic,这里面就包含有TBW102
自动创建topic一般发生在producer投递信息的时候,主要触发在获取需要发送的topic的分布队列的时候
rocketmq 自动创建topic源码分析

topic首次发送消息,此时并不能从namserver获取topic的路由信息,那么接下来会进行第二次请求namserver,这时会将isDefault=true,开启默认“TBW102”从namerserver获取路由信息,此时的“TBW102”topic已经被broker默认注册到nameserver了。
rocketmq 自动创建topic源码分析

如果isDefault=true并且defaultMQProducer不为空【正常都是不为空】,从nameserver中获取默认路由信息,此时会获取所有已开启自动创建开关的broker的默认“TBW102”topic路由信息,并保存默认的topic消息队列数量。
判断当前topic的信息是否是有改变,因为未创建过,所以肯定是有改变。
rocketmq 自动创建topic源码分析

当有改变,则更新本地的topic相关缓存信息。
rocketmq 自动创建topic源码分析
特别注意:
整个思路实现,就是利用TBW102作为参考,topic不存在,依赖于TBW102的配置信息,将新topic的新路由更新到本地。这个时候创建topic的请求其实还没有发送到我们的broker真正创建,只是缓存在我们本地缓存。
将“TBW102”topic路由信息构建TopicPublishInfo,并将用topic为key,TopicPublishInfo为value更新本地缓存,到这里就明白了,原来broker们千辛万苦创建“TBW102”topic并将其路由信息注册到nameserver,被新来的topic获取后立即用“TBW102”topic的路由信息构建出一个TopicPublishInfo并且据为己有,由于TopicPublishInfo的路由信息时默认“TBW102”topic,因此真正要发送消息的topic也会被负载发送到“TBW102”topic所在的broker中,这里我们可以将其称之为偷梁换柱的做法。

那什么时候才是broker创建topic的时候?

当broker接收到消息后,会在msgCheck方法中调用createTopicInSendMessageMethod方法,将topic的信息塞进topicConfigTable缓存中,并且broker会定时发送心跳将topicConfigTable发送给nameserver进行注册。
rocketmq 自动创建topic源码分析
rocketmq 自动创建topic源码分析
rocketmq 自动创建topic源码分析

整体的时序图如下:

1、当topic不存在,且允许自动创建,拿tbw102的topic信息先缓存到本地。
2、在真正发送信息给broker时,broker会根据实际传达到的信息,创建topic。