最近想系统的学习下消息队列。先从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信息。也就是错误信息中的路由信息




近期评论