引言
消息生产者怎么得知消息会发往哪台服务器?如果服务器宕机,生产者如何感知?
NameServer:路由中心。
提供路由管理、服务注册与服务发现的机制,使消费者找到远程的生产者,完成网络通信。
每个NameServer都会和所有的Broker连接,NameServer之间互不相连,同一时刻NameServer之间的数据可能并不相同。
当Broker启动时,先向 所有NameServer注册,二者之间保持长连接。当Producer要发送信息时,先从NameServer查,再根据负载均衡算法选择Broker发送消息。
NameServer启动流程
- 获取业务参数NameSrvConfig和网络参数NettyServerConfig,获取启动属性。
- 创建NamesrvController实例并初始化,该类用于控制NameServer。初始化过程中,加载kvconfig配置,创建Netty网络处理对象;开启定时任务:(1)每10s扫描一次是否有不活跃的Broker移除(2)每10s打印一次kv配置
- 创建ShutdownHook,启动服务器。
RoutInfoManager
在上述启动流程中,我们是通过RoutInfoManager类获取Broker信息的,RoutInfoManager类中存放了路由元数据信息。
private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;
类中包含了五个HashMap:
topicQueueTable:Topic消息队列路由信息,发送消息时根据该表进行负载均衡发送到不同队列。(一个topic包含多个消息队列)
brokerAddrTable:BrokerName,所属集群,主备地址。
clusterAddrTable:Broker集群信息
brokerLiveTable:Broker状态信息,根据收到的Broker心跳包进行更新。
filterServerTable:消息过滤
BrokerData中包含一个HashMap,表示Master-Slave结构:
private HashMap<Long/* brokerId */, String/* broker address */> brokerAddrs;
brokerId=0为master,brokerId>0为slave。
路由注册
当Broker启动时,它会通过一个定时任务,每隔30s向所有nameServer发送心跳包。调用BrokerOuterAPI的r