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;// 主brokerprivate String masterBroker;// 从broker列表private List<Strign> slaveBrokers;}class QueueData{// broker名称private String brokerName;// 绑定的生产者数量private String producerCnt;// 绑定的消费者数量private String consumerCnt;// 同步标记private String syncFlag;}}
