「日拱一卒」带你探索RocketMQ消息发送(五)

104 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

前言

上篇文章,我们简单看了下消息发送流程中的前两步,第一步是验证消息长度,第二步是查找主题,我们继续来看消息发送后续的流程吧~

查找主题细节

查询 Topic 的路由信息还是有很多细节值得我们注意。Producer 在第一次发生消息时,由于本地没有缓存 Topic 的路由信息,则需要去 NameServer 查询路由信息;若 Topic 路由信息未查询到,则需要使用默认的 Topic (注意:这里需要 RocketMQ 开启了使用默认 Topic 的配置)去查询。

查询 Topic 路由信息的方法主要是 MQClientInstance#updateTopicRouteInfoFromNameServer,接下来一起看看该方法主要做了些啥?

  • 如果 isDefault = true ,则使用默认 Topic 查询,如果查询到路由信息,则将路由信息中读写队列的个数替换为消息生产者默认的队列个数

image.png

  • 如果 isDefault = false,则使用 Topic 查询路由信息,如果未查询到路由信息,则返回 false,表明路由信息未发生变化

image.png

  • 若查询到路由信息,且与本地缓存的路由信息对比之后,发生了变化,则需要依次去更新 brokerAddrTable(Broker 地址缓存)、producerTable (生产者发布信息缓存)、consumerTable (消费者订阅信息缓存)。即把 Topic 路由信息所对应的 Broker 的名称、IP地址更新到 Broker 地址缓存中;把 Topic 路由信息更新到生产者发布信息缓存,下一次发送消息时,就能够从缓存中获取到这一次的路由信息了;把 Topic 路由信息更新到消费者订阅信息缓存,下一次消费消息时,能够从缓存中获取到这一次的路由信息了。

image.png

小结

今天跟大家一起了解了查找 Topic 路由信息的细节,简单来说,就是发送消息前,需要根据消息的 Topic 查询它的路由信息,这样 Producer 才知道该把消息发往哪个 Broker。查找 Topic 的步骤有:

  • 先查询本地缓存,若查询到,则使用本地缓存中的路由信息
  • 本地缓存查询不到,则查询 Topic 对应的路由信息:首先从 NameServer 进行查询,查询到了,则更新本地缓存;如果查询不到,且开启了使用默认 Topic,则使用默认 Topic的路由信息
  • 若上述步骤都无法查询到路由信息,则返回报错