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就是通过超时未上报来判断机器故障进行节点排除并同步下发。
存储的信息包括:

集群状态

  1. class RouteInfoManager{
  2. // topic和partition列表的映射
  3. private final HashMap<String, List<QueueData>> topicQueueTable;
  4. // broker和主从信息的映射
  5. private final HashMap<Strng, BrokerData> brokerAddrTable;
  6. // cluster和broker列表的映射
  7. private final HashMap<Strng, Set<String>> clusterAddrTable;
  8. // broker机器(BrokerData中的机器)和存活状态的映射
  9. private final HashMap<Strng, BrokerLiveInfo> brokerLiveTable;
  10. // broker和filter列表的映射
  11. private final HashMap<Strng, List<String>> filterServerTable;
  12. class BrokerData{
  13. // 集群名称
  14. private String clusterName;
  15. // 主broker
  16. private String masterBroker;
  17. // 从broker列表
  18. private List<Strign> slaveBrokers;
  19. }
  20. class QueueData{
  21. // broker名称
  22. private String brokerName;
  23. // 绑定的生产者数量
  24. private String producerCnt;
  25. // 绑定的消费者数量
  26. private String consumerCnt;
  27. // 同步标记
  28. private String syncFlag;
  29. }
  30. }