NameServer简介
NameServer是整个消息队列中的状态服务器
,集群的各个组件通过它来了解全局的信息 。 同时,各个角色的机器都要定期向 NameServer上报自己的状态,超时不上报的话, NameServer 会认为某个机器出故障不可用了,其他的组件会把这个机器从可用列表里移除 。
看下阿里中间件团队对NameServer特点总结:
Name Server是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。
Name Server 源码总共1000+ 行 说明了是一个非常轻量级的协调中间件, 多个name sever节点之间不会相互通信, 而是同时向所有name server报告, 从而达到分担压力和高可用.
NamServer可以部署多个,相互之间独立,其他角色同时向多个 NameServer 机器上报状态信息,从而达到热备份的目的。 NameServer本身是无状态的,也就是说 NameServer 中的 Broker、 Topic 等状态信息不会持久存储,都是由各个角色定时上报并存储到内存中的。
NameServer的核心数据
private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
- 说明:
topicQueueTable
这个结构的 Key 是 Topic 的名称,它存储了所有 Topic 的属性信息 。
Value 是个 QueueData 队列 , 队里的长度 等于这 个 Topic 数据存储的 MasterBroker的个数,QueueData
里存储着 Broker的名称、 读写queue的数量、 同步标识等。
private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
- 说明:以
BrokerName
为 索 引 ,相 同 名 称的 Broker 可能存在多台机器
, 一个 Master
和多个 Slave。 这个结构存储着一个 BrokerName 对应的属性信 息,包括所属的 Cluster 名称,
一 个 Master Broker 和多个 Slave Broker 的地址信息 。
private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
- 说明:存储的是集群中
Cluster
的信息,结果很简单,就是一个 Cluster 名称对 应一个由BrokerName
组成的集合。
private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
- 说明:这个结构和
BrokerAddrTable
有关系,但是内容完全不同,这个结构的 Key 是BrokerAddr
,也就是对应着一台 机器,BrokerAddrTable
中的 Key 是BrokerName
, 多个机器的BrokerName可以相同。 BrokerLiveTable 存储的内容是这台 Broker机器的实时状态,包括上次更新状态的时间 戳,NameServer会定期检查这个时间戳,超时没有更新就认为这个 Broker无效了,将其从 Broker列表里清除。
private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
- 说明:Filter Server是过滤服务器,是 RocketMQ 的一种服务端过滤方式,一 个 Broker 可以有 一个 或 多个 Filter Server。 这个结构的 Key 是 Broker 的地址, Value 是和这个 Broker关联的多个 Filter Server 的地址 ,新版已被放弃, 这里不做讨论。
其中关键的四张表的结构如上图所示。至于具体源码, 静待下章分析。