RocketMQ错误解决:Norouteinfoof

最近想系统的学习下消息队列。先从RocketMQ入手,按照官网的demo进行设置运行,结果在Producer发送消息时报错了:No route info of this topic

这里首先说一下解决办法,官网给的Quick Start中给的版本是4.7.1,但是Simple Message Example中给的Maven版本信息是

<dependency>
        <groupId>org.apache.rocketmq</groupId>
        <artifactId>rocketmq-client</artifactId>
        <!-- 这里的版本要改成4.7.1与服务端(broker和namesrv)的版本保持一致 -->
        <version>4.3.0</version> 
</dependency>
复制代码

需要保证版本的一致才可以在topic不存在时默认创建topic发送消息。

要想了解原因,需要先了解下RocketMQ的各个概念。

  • nameserver 命名服务,主要存储topic信息
  • topic 消息的逻辑集合
  • broker 代理类,实际的存储单元,可以存储多个topic的消息
  • messageQueue 消息集合,存储于broker中,属于topic
  • message 存储于messageQueue
  • producer 消息生产者
  • consumer 消息消费者

详细解释可以查询官网

回到我们的问题,这里版本不一致导致自动创建topic失败的实际原因是因为不同版本的预置topic名称不一样
抛开物理结构来看,RocketMQ的逻辑存储结构是这样的
producer/consumer -> nameserver -> topic -> messageQueue -> broker
也就是说需要nameserver通过topic来找到具体的broker信息,这也就是预置的topic的作用,可以通过预置的topic找到所有允许自动创建topic的broker信息。也就是错误信息中的路由信息