broker
Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master,Master与Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册Topic信息到所有NameServer。 注意:当前RocketMQ版本在部署架构上支持一Master多Slave,但只有BrokerId=1的从服务器才会参与消息的读负载。
namesrv对标kafka中的zookeeper,dubbo中的zookeeper,redis中的sentinel,都是用于管理系统的中状态、信息同步。
所有角色(producer、consumer、broker)都需要向namesrv定时上报状态(namesrv机器之间没有信息交换)。因为namesrv就是通过超时未上报来判断机器故障进行节点排除并同步下发。
存储的信息包括:
集群状态
class RouteInfoManager{
// topic和partition列表的映射
private final HashMap<String, List<QueueData>> topicQueueTable;
// broker和主从信息的映射
private final HashMap<Strng, BrokerData> brokerAddrTable;
// cluster和broker列表的映射
private final HashMap<Strng, Set<String>> clusterAddrTable;
// broker机器(BrokerData中的机器)和存活状态的映射
private final HashMap<Strng, BrokerLiveInfo> brokerLiveTable;
// broker和filter列表的映射
private final HashMap<Strng, List<String>> filterServerTable;
class BrokerData{
// 集群名称
private String clusterName;
// 主broker
private String masterBroker;
// 从broker列表
private List<Strign> slaveBrokers;
}
class QueueData{
// broker名称
private String brokerName;
// 绑定的生产者数量
private String producerCnt;
// 绑定的消费者数量
private String consumerCnt;
// 同步标记
private String syncFlag;
}
}