Name Server :简单理解 注册中心 NameServer集群,各节点间相互不进行信息通讯
Broker :MQ实列 (负责存储消息,转发消息。存储元数据,包括消费者组,进度偏移offset,topic queue等)
Producer在发送消息时可以将消息写入到指定topic的某Broker中的某Queue中,其经历了如下过程:
Producer发送消息之前,会先向NameServer发出获取消息Topic的路由信息的请求
NameServer返回该Topic的路由表及Broker列表
Producer根据代码中指定的Queue选择策略,从Queue列表中选出一个队列,用于后续存储消息
Produer对消息做一些特殊处理,例如,消息本身超过4M,则会对其进行压缩
Producer向选择出的Queue所在的Broker发出RPC请求,将消息发送到选择出的Queue
QueueData
nameServer维护的路由表,实际是一个Map,key为Topic名称,value是一个QueueData实例集合
而一个QueueData则包含一个Broker实例的所有此topic的Queue信息
即一个Broker对应一个QueueData。QueueData中包含brokerName。
简单来说,路由表的key为Topic名称,value则为所有涉及该Topic的 BrokerName列表
路由表: 是一个map key 是 topic value QueueData实列列表。
{
"TopicTest":[
{
"brokerName":"broker-a",
"perm":6,
"readQueueNums":4,
"topicSynFlag":0,
"writeQueueNums":4
}
]}
那根据Topic可以获取到BrokerName,怎么由BrokerName获取到对应的连接地址信息呢
Broker列表:
其实际也是一个Map。key为brokerName,value为BrokerData。
一个BrokerData对应一套brokerName名称相同的Master-Slave小集群
BrokerData中包含brokerName及一个map。该map的key为brokerId,value为该
broker对应的地址。brokerId为0表示该broker为Master,非0表示Slave。
{
"broker-a":{
"brokerAddrs":{
"0":"172.16.62.75:10911
},
"brokerName":"broker-a",
"cluster":"DefaultCluster"
}}