1、rocketmq的组件架构
2、namesrv基本作用
NameServer是一个简单的 Topic 路由注册中心,支持 Topic、Broker 的动态注册与发现。
- Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;
- 路由信息管理,每个NameServer将保存关于 Broker 集群的整个路由信息和用于客户端查询的队列信息。Producer和Consumer通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。
3、namesrv的启动流程
3.1、启动流程
ROCKETMQ_HOME=D:\java study\rocketmq\distribution
出现以下则启动成功:
The Name Server boot success. serializeType=JSON
public static NamesrvController main0(String[] args) {
try {
NamesrvController controller = createNamesrvController(args);
start(controller);
String tip = "The Name Server boot success. serializeType=" + RemotingCommand.getSerializeTypeConfigInThisServer();
log.info(tip);
System.out.printf("%s%n", tip); return controller;
}
catch (Throwable e) {
e.printStackTrace(); System.exit(-1);
}
return null;
}
上述代码比较简单:
- 创建NameServer中的内置对象
- 启动NameServier, 其实就是启动一个netty server,接受netty client的请求
4、核心类图分析
4.1
5. 核心代码分析
通过上述分析,其实namesrv最重要的功能就是管理broker的列表,也就是broker的增删查改。(听起来还挺简单的)
在分析代码之前,我心中有几个问题:
- broker列表是维护在哪里的呢?有无持久化的存储引擎?
- 维护broker的数据结构长什么样?我们自己来设计如何设计?
- namesrv中的broker假如已经下线了,但client已经拉到了下线的broker,应该如何处理呢?消息会发送/读取失败么?