摘要
RocketMQ架构体系里有四个角色:NameServer、Broker、Producer、Consumer。其中,Broker统称为服务端,Producer属于消息生产者和Consumer属于消息消费者,他们统称为客户端。客户端要如何与服务端通信?拿消息发送举例,一个消息可以发送到哪些Broker上?有新的Broker上线/旧的Broker下线,客户端如何感知到?在RocketMQ中就是NameServer来实现的。
NameServer的两大职责:路由管理、服务注册与发现。它就像微服务架构中的【注册中心】,类似于Zookeeper,但是它比Zookeeper更加的轻量级。Zookeeper是强一致性的,效率较低,RocketMQ的架构设计决定了NameServer不需要那么复杂的功能,因此阿里设计了一款足够轻量的NameServer。
NameServer支持集群部署,但是节点之间不会有任何通信和数据同步,每个节点都是无状态的。Broker启动后,会向所有的NameServer注册自己的路由信息,因此每一个NameServer节点都会有一份完整的数据。当某个NameServer下线了,客户端仍然可以动态感知到服务端的存在。
在NameServer的设计中,Broker信息、路由信息都是保存在内存中的,虽然也支持持久化存储,但是没什么必要。NameServer还有一个组件KVConfigManager,它用来管理键值对类型的配置数据,它是会持久化存储的,持久化目录为home/namesrv/kvConfig.json,通过文件名就知道,它通过JSON的方式来管理数据,每次数据的变动都会自动持久化到磁盘,服务启动后会自动调用load()方法从磁盘加载到内存。
一、NameServer启动流程
要想启动NameServer,只需要运行bin目录下的mqnamesrv脚本。查看这个脚本文件,它的最后一行命令为
sh ${ROCKETMQ_HOME}/bin/runserver.sh org.apache.rocketmq.namesrv.NamesrvStartup $@
它会执行/bin/runserver.sh
脚本,启动NamesrvStartup类。因此要分析NameServer的启动流程,以NamesrvStartup类的main方法为入口就好了。