RocketMQ之NameServer源码浅析

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 的地址 ,新版已被放弃, 这里不做讨论。

其中关键的四张表的结构如上图所示。至于具体源码, 静待下章分析。

猜你喜欢

转载自blog.csdn.net/qq_33709508/article/details/107999342