RocketMQ中的NameServer主要数据结构

1.前言

NameServer是RocketMQ中的一个比较重要的组件,我们这篇博客针对NameSever中包含的组件进行分析,分析一下NameServer中包含的组件以及组件的作用。以前我有一篇博客中rocketMq源码分析之搭建本地环境-CSDN博客,在这篇博客中就简单看了下NameSever中会有两个组件:NamesrvConfig和NettyServerConfig。在这里就不在进行介绍。

2.KVConfigManager

这个KVConfigManager的核心作用是提供一个统一的地方来存储和管理一些全局的配置信息,这些配置信息以键值对的形式存在,不同的业务模块或者不同的命名空间可以使用这些配置来完成特定的任务。

java 复制代码
private final HashMap<String/* Namespace */, HashMap<String/* Key */, String/* Value */>> configTable =
        new HashMap<String, HashMap<String, String>>();

 

里面存放了一个HashMap用来存放一个一个键值对。主要包含putKVConfig方法,getKVConfig方法以及persist(持久化到磁盘)方法。

3.RouteInfoManager

这个RouteInfoManager是NameServer中最重要的一个组件,主要负责管理和维护整个 RocketMQ 集群的路由信息,核心作用是维护 RocketMQ 集群中各种组件(如 Broker、Topic 等)的路由元数据信息,使得生产者和消费者能够准确地找到所需的消息队列,从而实现消息的正确发送和消费。

下面是RouteInfoManager中的主要数据结构:

java 复制代码
public class RouteInfoManager {
    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
    // broker长连接过期时间 长连接的空闲时间是2分钟
    private final static long BROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2;
    //读写锁
    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    // 创建topic 以后 topic是逻辑上的概念 一个topic会有多个Queue Queue会分散到不同的broker上
    private final HashMap<String/* topic */, Map<String /* brokerName */ , QueueData>> topicQueueTable;
    //  代表的broker组的信息 BrokerData包含了一组Broker的信息
    private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
    // 一个NameServer可以管理多个broker组 通常来说一个Cluster就可以了
    // 有可能会有很多复杂的业务场景 多个Cluster
    private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
    //管理Broker的长连接心跳 是否还有心跳
    private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
    // Filter Server 是rocketMQ的一个高级功能,用来过滤消息
    //一般情况下 我们是可以基于tag进行数据筛选的操作,比较简单,没有办法进行更加细化的过滤
    //这个Filter Server是在每台Broker机器上启动一个(或者多个)Filter Server
    //我们可以把一个自定义的消息筛选的class 上传到Filter server上,在进行数据消费的时候让Broker把数据先传输到Filter Server
    // Filter Server会根据你自定义的class来进行细粒度的数据筛选,把筛选后的数据回传给你的消费端
    private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;

这个RouteInfoManager会有一些比较核心的方法,

1.getAllClusterInfo 获取集群的信息

java 复制代码
    /**
     * 返回的是 broker的cluster信息
     * 里面包含的是HashMap<String //brokerName//  BrokerData> brokerAddrTable
     * HashMap<String  //clusterName// , Set<String //brokerName// >> clusterAddrTable
     * @return
     */
    public ClusterInfo getAllClusterInfo() {
        ClusterInfo clusterInfoSerializeWrapper = new ClusterInfo();
        clusterInfoSerializeWrapper.setBrokerAddrTable(this.brokerAddrTable);
        clusterInfoSerializeWrapper.setClusterAddrTable(this.clusterAddrTable);
        return clusterInfoSerializeWrapper;
    }

2.deleteTopic 删除对应的topic信息

java 复制代码
    /**
     * 删除某个topic 直接操作topicQueueTable的hashMap
     * @param topic
     */
    public void deleteTopic(final String topic) {
        try {
            try {
                this.lock.writeLock().lockInterruptibly();
                this.topicQueueTable.remove(topic);
            } finally {
                this.lock.writeLock().unlock();
            }
        } catch (Exception e) {
            log.error("deleteTopic Exception", e);
        }
    }

3.getAllTopicList 查看所有的topic信息

java 复制代码
/**
     * 查询所有的topic的列表信息
     * @return
     */
    public TopicList getAllTopicList() {
        TopicList topicList = new TopicList();
        try {
            try {
                this.lock.readLock().lockInterruptibly();
                topicList.getTopicList().addAll(this.topicQueueTable.keySet());
            } finally {
                this.lock.readLock().unlock();
            }
        } catch (Exception e) {
            log.error("getAllTopicList Exception", e);
        }

        return topicList;
    }

4.registerBroker 注册broker方法

java 复制代码
  /**
     * broker的注册方法
     * @param clusterName broker的集群名称
     * @param brokerAddr broker的地址
     * @param brokerName broker所属组的名称
     * @param brokerId   broker机器的id
     * @param haServerAddr broker的ha地址
     * @param topicConfigWrapper 当前broker机器上包含的topic队列上的数据
     * @param filterServerList broker上部署的filterServer的列表
     * @param channel netty的网络长连接
     * @return broker注册的结果
     */
    public RegisterBrokerResult registerBroker(
            final String clusterName,
            final String brokerAddr,
            final String brokerName,
            final long brokerId,
            final String haServerAddr,
            final TopicConfigSerializeWrapper topicConfigWrapper,
            final List<String> filterServerList,
            final Channel channel) {
  
  

4.总结

老规矩,我们用一张图来进行总结一下这个文章的核心内容。

相关推荐
新时代牛马1 分钟前
PCI与PCIe 硬件原理、配置空间/BAR 与 Linux 驱动完整篇:从 LTSSM、TLP 到 ECAM 与probe
java·linux·服务器
Bs_MoneyMagnet9 分钟前
基于springboot+vue的医疗健康便民服务平台的设计与实现 源码+文档
java·vue.js·spring boot·后端·spring
sunshine22 girl1 小时前
Java学习一 环境配置2 Idea的入门使用和maven配置,项目启动脚本配置
java·maven
有点。2 小时前
*C++哈夫曼树与哈夫曼编码
java·c++·servlet
CRMEB系统商城2 小时前
CRMEB标准版系统(Java)v3.1正式发布
java·spring·微信小程序·php·教育电商
写后端的胖头鱼3 小时前
【高频面试题】Java 基础类型 + 包装类 + String 互相转换
java·开发语言
weixin_460443563 小时前
企业考试系统从.NET迁移到Java+Linux:数据库迁移、接口兼容与灰度切换实践
java·煤矿培训考试系统·煤矿在线考试系统·煤矿安全培训·煤矿考试系统·一人一档
香菜TTT3 小时前
Redis的哨兵机制
java·数据库·redis
withoutfear3 小时前
IntelliJ IDEA卡顿内存分配不足和索引被频繁触发问题解决办法
java·ide·intellij-idea
大圣编蚕3 小时前
Java StringWriter 详解:从入门到实战
java·开发语言·python