1. Broker 上报信息阶段
- 数据结构:Broker 会将自身的元数据信息,如 Broker 名称、所属集群名称、IP 地址、端口号、是否是主 Broker 等封装成特定的消息格式。一般可以使用类似于 JSON 或者自定义的二进制协议格式来传输这些数据。例如,在自定义二进制协议中,可以定义不同的字段标识来区分各个元数据信息。
- 上报过程:Broker 启动后,会周期性地向 NameServer 发送心跳包,心跳包中携带上述元数据信息。这可以通过网络通信框架(如 Netty)来实现,建立 TCP 连接后,将封装好的心跳消息发送出去。
2. NameServer 获取并存储信息阶段
- 数据结构:NameServer 内部使用多种数据结构来存储 Broker 上报的信息。通常会有一个集群维度的 Map,以集群名称为键,值为该集群下所有 Broker 的列表。对于每个 Broker,会使用一个对象来存储其详细信息,这个对象包含 Broker 的各种元数据字段。例如,在 Java 中可以定义如下类结构:
class BrokerData {
String brokerName;
String clusterName;
String brokerAddr;
boolean isMaster;
// 其他相关属性
}
Map<String, List<BrokerData>> clusterBrokerMap = new HashMap<>();
- 处理算法:当 NameServer 接收到 Broker 的心跳包后,解析其中的元数据信息。首先根据集群名称查找
clusterBrokerMap
中对应的集群列表,如果不存在则创建一个新的列表。然后检查该 Broker 是否已在列表中,如果已存在则更新其相关信息(如心跳时间等),如果不存在则添加新的 BrokerData
对象到列表中。
3. 为客户端提供路由数据阶段
- 数据结构:客户端请求路由数据时,NameServer 返回的数据结构同样基于上述存储的 Broker 信息。可以将集群信息、Broker 信息等整理成一个易于客户端解析的格式,例如 JSON 格式:
{
"clusters": [
{
"clusterName": "Cluster1",
"brokers": [
{
"brokerName": "broker-a",
"brokerAddr": "192.168.1.100:9876",
"isMaster": true
},
{
"brokerName": "broker-b",
"brokerAddr": "192.168.1.101:9876",
"isMaster": false
}
]
}
]
}
- 处理算法:当客户端发起路由请求时,NameServer 根据请求的类型(可能是获取所有集群信息,或者特定集群的 Broker 信息等),从
clusterBrokerMap
中提取相应的数据,并按照客户端要求的格式进行组装和序列化。例如,如果客户端请求获取所有集群信息,NameServer 遍历 clusterBrokerMap
,将每个集群及其包含的 Broker 信息整理成上述 JSON 格式后返回给客户端。在网络传输方面,同样借助网络通信框架(如 Netty)将序列化后的数据发送给客户端。