启动流程
NamesrvStartup
nameserver之间没有任何通信,不会同步数据,如果broker只向其中1台注册,而客户端使用另一台,会找不到主题
注册broker
broker在启动时会执行BrokerController#registerBrokerAll向每台nameserver发起注册broker(RequestCode.REGISTER_BROKER)请求,注册信息包括:brokerClusterName、brokerName、brokerAddr、brokerId、主题配置信息,创建主题时也会发送该请求,nameserver端由DefaultRequestProcessor处理。
DefaultRequestProcessor通过RouteInfoManager来注册broker,将信息保存到RouteInfoManager的属性中
public class RouteInfoManager {
//一个cluster可以对应多个brokerNameMap > clusterAddrTable;Map brokerAddrTable;//这里可以看出不同broker上可以创建同名主题Map> topicQueueTable;Map brokerLiveTable;
}
//每个brokerName对应的信息,可以对应多个brokerId不同的broker实例,比如一主多从
public class BrokerData{private String cluster;private String brokerName;//brokerId->brokerIp:portprivate HashMap brokerAddrs;
}
//队列的配置信息
public class QueueData{private String brokerName;private int readQueueNums;private int writeQueueNums;private int perm;
}
生产者获取主题路由数据
MQClientAPIImpl#getTopicRouteInfoFromNameServer
RequestCode.GET_ROUTEINFO_BY_TOPIC请求的执行器:根据主题名称从RouteInfoManager中获取主题信息,主题的信息从topicQueueTable中获取,主题的broker地址从brokerAddrTable获取。一个brokerName对应一主多从,如果某个brokerName没有主,则取brokerId最小的为主