RocketMQ 源码分析 NamesrvController(三)

rocketMq源码分析之Broker启动 此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》,我本人觉得这个作者还是不错,都是从场景来进行分析,感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔记。想看原版的,还是去儒猿课堂。这篇文章紧挨着上一篇文章。 阅读详情

前言

上一篇在讲到createNamesrvController方法的时候,根据NamesrvConfig和NettyServerConfig对象生成了一个NamesrvController对象,当时并没有deep到该类中,所以这篇来记录一下NamesrvController构造函数的分析。

NamesrvController类

下面是NamesrvController的构造类,这里重点关注的是kvConfigManager、routeInfoManager、brokerHousekeepingService。

public NamesrvController(NamesrvConfig namesrvConfig, NettyServerConfig nettyServerConfig) {
    // Name Server配置
    this.namesrvConfig = namesrvConfig;
    // Netty配置 
    this.nettyServerConfig = nettyServerConfig;
    // KV配置管理
    this.kvConfigManager = new KVConfigManager(this);
    // 路由信息管理 
    this.routeInfoManager = new RouteInfoManager();
    // Broker连接事件处理服务 
    this.brokerHousekeepingService = new BrokerHousekeepingService(this);
    this.configuration = new Configuration(
        log,
        this.namesrvConfig, this.nettyServerConfig
    );
    this.configuration.setStorePathFromConfig(this.namesrvConfig, "configStorePath");
}
kvConfigManager

KVConfigManager作用:

1.加载namesrvController指定的kvConfig配置文件(常为xxx/kvConfig.json)到内存进行读取、增加、删除kvConfig记录。
2.将内存记录的配置,持久化到文件
3.打印所有kvConfig配置

针对上面我有一个疑惑,就是kvConfig.json保存了什么配置呢?服务的一些配置不是在NamesrvConfig和NettyServerConfig中保留了吗?!

KVConfigManager有三个主要成员变量:

public class KVConfigManager {
    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
    // Name Server主要控制类 
    private final NamesrvController namesrvController;
    // 读写锁 
    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    
    /** 
    * 以命名空间为单位存储的配置文件,存数示例如下: 
    * {"configTable":{"ORDER_TOPIC_CONFIG":{"UnitTest":"test"}}}% 
    * 此处的Namespace为ORDER_TOPIC_CONFIG,暂时不知道Namespace具体的含义 
    */ 
    private final HashMap<String/* Namespace */, HashMap<String/* Key */, String/* Value */>> configTable =
        new HashMap<String, HashMap<String, String>>();

    public KVConfigManager(NamesrvController namesrvController) {
        this.namesrvController = namesrvController;
    }
    ..........省略
}

RouteInfoManager

RouteInfoManager实例中保存了整个消息集群的相关信息,这个是关键类,所以后面对其还需要进一步阅读:

public class RouteInfoManager {
    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
    private final static long BROKER_CHANNEL_EXPIRED_TIME = 1000 * 60 * 2;
    // 读写锁 
    private final ReadWriteLock lock = new ReentrantReadWriteLock();
    // Topic,以及对应的队列信息 
    private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;
    // 以Broker Name为单位的Broker集合 
    private final HashMap<String/* brokerName */, BrokerData> brokerAddrTable;
    // 集群以及属于该进群的Broker列表 
    private final HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable;
    // 存活的Broker地址列表 
    private final HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable;
    // Broker对应的Filter Server列表 
    private final HashMap<String/* brokerAddr */, List<String>/* Filter Server */> filterServerTable;

    public RouteInfoManager() {
        this.topicQueueTable = new HashMap<String, List<QueueData>>(1024);
        this.brokerAddrTable = new HashMap<String, BrokerData>(128);
        this.clusterAddrTable = new HashMap<String, Set<String>>(32);
        this.brokerLiveTable = new HashMap<String, BrokerLiveInfo>(256);
        this.filterServerTable = new HashMap<String, List<String>>(256);
    }
    ..........省略
}

BrokerHousekeepingService

该类负责Broker连接事件的处理,实现了ChannelEventListener,主要用来管理RouteInfoManager的brokerLiveTable。BrokerHousekeepingService实现了ChannelEventListener接口, 并且NettyRemotingServer启动时会启动BrokerHousekeepingService。

BrokerHousekeepingService会对连接事件, 连接关闭事件, 异常事件,闲置事件进行处理,进而来判断管理存活的broker。

public class BrokerHousekeepingService implements ChannelEventListener {
    private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
    private final NamesrvController namesrvController;

    public BrokerHousekeepingService(NamesrvController namesrvController) {
        this.namesrvController = namesrvController;
    }

    //连接事件
    @Override
    public void onChannelConnect(String remoteAddr, Channel channel) {
    }

    //关闭事件
    @Override
    public void onChannelClose(String remoteAddr, Channel channel) {
        this.namesrvController.getRouteInfoManager().onChannelDestroy(remoteAddr, channel);
    }

    //异常事件
    @Override
    public void onChannelException(String remoteAddr, Channel channel) {
        this.namesrvController.getRouteInfoManager().onChannelDestroy(remoteAddr, channel);
    }

    //闲置事件
    @Override
    public void onChannelIdle(String remoteAddr, Channel channel) {
        this.namesrvController.getRouteInfoManager().onChannelDestroy(remoteAddr, channel);
    }
}

上面四个方法在监听到事件时,就会触发RouteInfoManager的onChannelDestroy()方法,这个方法比较关键的,所以后面单独抽出来讲。

rocketMq源码分析之搭建本地环境 此文章是在儒猿课程中的学习笔记,感兴趣的想看原来的课程可以去咨询儒猿课堂《从0开始带你成为RocketMQ高手》,我本人觉得这个作者还是不错,都是从场景来进行分析,感觉还是挺适合我这种小白的。这块主要都是我自己的学习笔记。想看原版的,还是去儒猿课堂。 阅读详情

相关推荐

基于高精度三维机器视觉的新能源汽车锂电池表面缺陷检测

在机器视觉行业迅速发展的背景下,市场上提供了功能强大且种类齐全的3D相机系列,可以满足锂电池从电芯到模组各个工艺和工位的3D检测需求。

Hinyeung_Limited的博客 1132

RocketMq源码分析(二)--nameServer启动流程

NameServer启动流程,源码解析

Shenkh的Java壁橱 476

告别Godot默认编辑器:手把手教你用VSCode配置C#开发环境(附中文注释避坑指南)

本文详细介绍了如何将VSCode配置为Godot引擎的C#开发环境,提升游戏开发效率。从环境准备、扩展配置到解决中文编码问题,提供完整的避坑指南和高级调试技巧,帮助开发者充分利用VSCode的智能补全和调试功能,打造高效工作流。

weixin_30596023的博客 189

rocketmq核心源码分析第二篇一Nameserver模块源码分析

文章目录namesrv原理图源码分析一NamesrvStartup启动nameservercreateNamesrvController创建nameserverstart启动nameservercontroller.initializenamesrvController.start总结扩展点一DefaultRequestProcessor扩展点一scanNotActiveBroker namesrv原理图 名称 内容 HashMap<String/* topic */, List&lt

小麒麟的博客 1463

Vision-Language Navigation - Windows环境下编译安装Matterport3D Simulator仿真器(三)

目录1 编译 Matterport3D Simulator 源码1.1 源码下载1.2 编译 1 编译 Matterport3D Simulator 源码   在 Windows 下编译 Matterport3D Simulator 稍微有些不方便,需要对 CMakeLists.txt 进行一些修改,如果有更好的方法欢迎大家评论。 1.1 源码下载   还是直接在 Github 上搜索 Matterport3D Simulator 的 repo,下载源码。如果用 zip 方式,那么直接在下即可。如果使用

weixin_44110393的博客 4845

【ANSYS APDL】提取结构刚度矩阵完整过程--附Python代码实现

ANSYS的结构刚度矩阵提取中一些操作技巧

m0_61038364的博客 1万+

全网最细RocketMQ源码一:NameSrv

NameServer的启动源码在NameStartup,现在开始debug之旅。

一只小星星 523

DIY音乐播放器:用VS1053模块+Arduino打造你的专属MP3播放器(附完整代码)

本文详细介绍了如何使用VS1053音频解码模块与Arduino开发板,从零开始构建一个功能完备的桌面级MP3播放器。内容涵盖硬件架构设计、SPI总线共享、底层驱动编写、双缓冲区数据流管理以及用户交互实现,并提供完整的代码示例与性能优化建议,帮助创客打造高度可定制的专属音乐播放设备。

weixin_29189003的博客 286

RocketMQ源码系列(一) NameServer 核心源码解析

一、NameServer 介绍 二、NameServer 功能列表 三、NameServer 架构分析 四、NameServer 架构

Dream_it_possible!的博客 2万+

从源码编译CesiumForUnreal

从源码编译CesiumForUnreal插件

专注GIS开发 5643

逆强化学习:从专家示范中学习策略

逆强化学习(Inverse Reinforcement Learning,简称IRL)是强化学习(Reinforcement Learning,简称RL)的一个子领域,它的目标是从专家的行为中学习策略。在传统的强化学习中,智能体通过与环境交互,根据奖励信号来学习一个策略。而在逆强化学习中,我们没有直接的奖励信号,而是通过观察专家的行为来推断出奖励函数,从而学习到一个与专家类似的策略。逆强化学习作为强化学习的一个重要子领域,在许多实际应用场景中都取得了显著的成功。

AI天才研究院 1449

NameServer源码解析

对于如何选择可重入和不可重入锁,重点看函数间的调用关系,比如多次获取锁的示例代码,如果这个lock是不可重入的,代码无法正常执行,如代码清单10-7所示。RouteInfoManager中使用的是可重入的读写锁(private final ReadWriteLock lock=new ReentrantReadWriteLock()),我们以deleteTopic函数为例,看一下锁的使用方式,如代码清单10-8所示。本节介绍入口代码的功能,阅读源码的时候,很多人喜欢根据执行逻辑,先从入口代码看起。

zhao_god的专栏 424

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RocketMQ源码分析之NameSrv

RocketMQ源码分析我们主要从NameSrv、路由、生产者、消费者、消息存储等方面一点点分析,本章主要讲的是NameSrv的源码分析。 NameSrv的启动类:org.apache.rocketmq.namesrv.NamesrvStartup。 NamesrvStartup的main()方法中调用main0(args),mian0()中其实最主要是createNamesrvControl...

xiaoye的博客 418

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深度解析RocketMq源码-Namesrv

前面几篇文章已经介绍了rocketmq的架构,如何使用以及生产上问题如何解决。接下来几篇文章将会介绍rocketmq的源码,我们在看问题的时候,会带着我们的问题去代码找答案,同时在代码中学习一些常见的代码技巧。接下来,我们先来探究一下NameSrv的源码。1.NameSrv之间是相互通信的吗?从上面源码分析,可以看出namesrv之间是没有通信的。2.NameSrv是如何存储topic的路由信息的?

zhifou123456的博客 1424

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

启动rocketmq_RocketMQ源码分析:NameServer启动流程

本文首发于Ressmix个人站点:https://www.tpvlog.com上一章,我们已经搭建好了RocketMQ的源码环境。从本章开始,我们正式进入RocketMQ的源码分析环节。分析一个开源框架的源码,必然从开源框架的入口开始。在RocketMQ使用的时候,第一个步骤一定是先启动NameServer,那么我们就先来分析NameServer启动这块的源码。一、启动入口1.1 启动脚...

weixin_39726697的博客 133

RocketMQ源码 NameServer启动流程源码分析

RocketMQ在启动 Namesrv 的过程中会创建NamesrvController控制器,并初始化一些核心组件RouteInfoManager路由信息管理组件、NettyRemotingServer网络通信服务器组件、BrokerHousekeepingService网络通信监听器组件,使用了大量JUC并发知识和Netty网络通信的应用。

hzwangmr的博客 1065

rocketMQ系列(7)RocketMQ源码分析之NameServer

1、RocketMQ组件概述 NameServer NameServer 相当于配置中心,维护 Broker 集群、Broker 信息、Broker 存活信息、主题与队列信息等。NameServer 彼此之间不通信,每个 Broker 与集群内所有的 Nameserver 保持长连接。 2、源码分析NameServer 2.1 源码分析 NamesrvController NameserController 是 NameServer 模块的核心控制类。 2.1.1 NamesrvConfig Namesr

liuerchong的博客 514

RocketMQ之NameServer源码分析

RocketMQ之NameServer源码分析

qq_40223516的博客 1248

【RocketMQ|源码分析】namesrv启动&停止过程都做了什么

namesrv在是RocketMQ中一个十分重要的组件,它相当于是Kafka中的zookeeper,Spring Cloud Alibaba中的nacos。它的主要作用是为消息生产者和消息消费者提供关于topic的路由信息。namesrv具有存储路由信息,并且能够管理broker节点(路由注册,路由删除等功能)。

MarcoLin 621

RocketMQ源码分析之NameServer(上)

前序 前面几篇是关于RocketMQ的介绍,从这篇开始就根据源码具体解析,分支是master,版本号是4.4.0。 实例化 注册中心的主方法在org/apache/rocketmq/namesrv/NamesrvStartup.java,通过命令行启动可以读取入参配置的具体文件,根据启动命令配置的-c属性读取文件,并设置到注册配置类namesrvConfig和服务端通信配置类nettySer...

494

【RocketMQ源码分析】Namesrv

一、下载源码 从github拉取rocketmq代码:https://github.com/apache/rocketmq.git,当前最新的版本是4.5.2.我用的是ideal,可以看到rocketmq源码结构如下: rocketmq共包含9个模块,解释一下各个模块的功能和作用: rocketmq-common:通用的枚举、基类方法、或者数据结构,包名有admin、consumer、filt...

chengbinbbs的专栏 511

RocketMQ的NameServer的架构设计及其启动流程源码分析

Broker启动的时候会向所有的NameServer注册,生产者在发送消息时会先从NameServer中获取Broker消息服务器的地址列表,根据负载均衡算法选取一台Broker消息服务器发送消息。但是路由的变化不会马上通知消息生产者,这是为了降低NameServe的复杂性,所以在RocketMQ中需要消息的发送端提供容错机制来保证消息发送的高可用性,这在后续关于RocketMQ消息发送的章节会介绍。关于注册JVM关闭钩子,这是很常见的用法,确保在关闭JVM的时候,先将线程池关闭,释放资源。

weixin_42008170的博客 382

rocketmq 启动_RocketMQ源码分析:NameServer启动流程

本文首发于Ressmix个人站点:https://www.tpvlog.com上一章,我们已经搭建好了RocketMQ的源码环境。从本章开始,我们正式进入RocketMQ的源码分析环节。分析一个开源框架的源码,必然从开源框架的入口开始。在RocketMQ使用的时候,第一个步骤一定是先启动NameServer,那么我们就先来分析NameServer启动这块的源码。一、启动入口1.1 启动脚...

weixin_39911056的博客 264

RocketMQ 第三章 高级功能和源码分析 2 源码分析 2.2 NameServer 2.2.1 架构设计 & 2.2.2 启动流程

RocketMQ 第三章 高级功能和源码分析 2 源码分析 2.2 NameServer 2.2.1 架构设计 & 2.2.2 启动流程

代码改变世界 476
上一篇: RocketMQ 源码分析 NamesrvStartup(二)
下一篇: RocketMQ 源码分析 RouteInfoManager(四)
CallMeJiaGu
博客等级 码龄12年 149粉丝 99原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值