RocketMQ源码学习笔记:NameServer启动流程

2024-06-17 23:28

本文主要是介绍RocketMQ源码学习笔记:NameServer启动流程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

这是本人学习的总结,主要学习资料如下

  • 马士兵教育
  • rocketMq官方文档

目录

  • 1、Overview
  • 2、NameServer启动流程
    • 2.1、总结
    • 2.2、NamesrvController
      • 2.2.1、主要职责
      • 2.2.2、关键的成员变量
      • 2.2.3、核心代码
      • 2.2.4、值得注意的点


1、Overview

NameServer主要就做三件事

  • NameServer启动:启动监听,等待Broker,Prod ucer,Consumer连接注册。
  • 路由注册:Borker启动后向所有NameServer发送路由和心跳信息。
  • 路由剔除:移除心跳超时的Broker相关路由信息。

源码学习也是针对核心功能看RocketMQ如何实现这三个功能。

这是RocketMQ的整体流程图。

图中的NRCNetty Remoting Client的缩写。可以看出RocketMQ是基于Netty实现网络通信。
在这里插入图片描述


2、NameServer启动流程

2.1、总结

入口是NamesrvStartup的psvm方法。

前面做完必要的参数处理之后,会创建一个NamesrvController的实例,由他负责初始化的工作,比如加载key-value配置,定时任务等。

所以源码分析的重点会放在NamesrvController的构建以及它的initialize()方法。
在这里插入图片描述

2.2、NamesrvController

2.2.1、主要职责

负责加载KV配置,构建NRS通讯实例,构建定时任务

这意味着它的成员变量会有一些集合,比如HashMap,用来存放各种各样的key-value配置。

同时会有NettyRemotingServer的实例代表着构建好的通讯实例。

还会有一些线程池用于定时任务。


2.2.2、关键的成员变量

NamesrvController中的重要成员变量对应着它的职责。

KVConfigManager对应着加载key-value配置。

RemotingServer负责网络请求。

RouteInfoManager则是负责路由管理。路由管理是指管理broker注册的路由信息。与路由相关的动作与信息都在这个变量中。它对于读写锁的运用也值得学习。

2.2.3、核心代码

NamesrcController相关代码需要从这两条线看。

  • main() -> main0() -> createNamesrcController()
    这个主要是实例化NamesrcController。当然在实例化之前会做一些检查,检查的代码较长,但最核心的就只有一句new NamesrvController(namesrvConfig, nettyServerConfig);。主要是将一些来自外部的配置信息注入到NamesrcController的成员变量中,为接下来的初始化做准备。

在这里插入图片描述

  • main() -> main0() -> start() -> controller.initialize()
    initialize()方法是最关键的,因为涉及到线程池的设置,NameServer的一些关键行为比如心跳检查,不活跃剔除的具体信息就可以在这里找到。看下图我们可以知道,移除不活跃的broker的定时认识是每10s一次,写死的值不可更改。

在这里插入图片描述


2.2.4、值得注意的点

  1. createNamesrvController()方法中,需要构建一个NettyServerConfig实例用来配置网络通信,其中包括NameServer监听的端口号。在源码中端口号被写死成9876,完全无法通过任何配置修改,nettyServerConfig.setListenPort(9876);。所以实际使用中想要修改NameServer监听的端口号就只能下载源码来改装。

  2. createNamesrvController()方法中,有一段分支会结束当前进程并答应所有配置信息,可以用来debug。在if (commandLine.hasOption('p')){}中,意味着我们只要在启动参数中配置一个-p就可以打印所有配置项。

在这里插入图片描述

这篇关于RocketMQ源码学习笔记:NameServer启动流程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1070697

相关文章

Redis在windows环境下如何启动

《Redis在windows环境下如何启动》:本文主要介绍Redis在windows环境下如何启动的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis在Windows环境下启动1.在redis的安装目录下2.输入·redis-server.exe

解决SpringBoot启动报错:Failed to load property source from location 'classpath:/application.yml'

《解决SpringBoot启动报错:Failedtoloadpropertysourcefromlocationclasspath:/application.yml问题》这篇文章主要介绍... 目录在启动SpringBoot项目时报如下错误原因可能是1.yml中语法错误2.yml文件格式是GBK总结在启动S

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Python实现无痛修改第三方库源码的方法详解

《Python实现无痛修改第三方库源码的方法详解》很多时候,我们下载的第三方库是不会有需求不满足的情况,但也有极少的情况,第三方库没有兼顾到需求,本文将介绍几个修改源码的操作,大家可以根据需求进行选择... 目录需求不符合模拟示例 1. 修改源文件2. 继承修改3. 猴子补丁4. 追踪局部变量需求不符合很

SpringBoot启动报错的11个高频问题排查与解决终极指南

《SpringBoot启动报错的11个高频问题排查与解决终极指南》这篇文章主要为大家详细介绍了SpringBoot启动报错的11个高频问题的排查与解决,文中的示例代码讲解详细,感兴趣的小伙伴可以了解一... 目录1. 依赖冲突:NoSuchMethodError 的终极解法2. Bean注入失败:No qu

一文带你了解SpringBoot中启动参数的各种用法

《一文带你了解SpringBoot中启动参数的各种用法》在使用SpringBoot开发应用时,我们通常需要根据不同的环境或特定需求调整启动参数,那么,SpringBoot提供了哪些方式来配置这些启动参... 目录一、启动参数的常见传递方式二、通过命令行参数传递启动参数三、使用 application.pro

SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

《SpringBoot项目启动报错找不到或无法加载主类的解决方法》在使用IntelliJIDEA开发基于SpringBoot框架的Java程序时,可能会出现找不到或无法加载主类com.example.... 目录一、问题描述二、排查过程三、解决方案一、问题描述在使用 IntelliJ IDEA 开发基于

Spring AI ectorStore的使用流程

《SpringAIectorStore的使用流程》SpringAI中的VectorStore是一种用于存储和检索高维向量数据的数据库或存储解决方案,它在AI应用中发挥着至关重要的作用,本文给大家介... 目录一、VectorStore的基本概念二、VectorStore的核心接口三、VectorStore的

python之流程控制语句match-case详解

《python之流程控制语句match-case详解》:本文主要介绍python之流程控制语句match-case使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录match-case 语法详解与实战一、基础值匹配(类似 switch-case)二、数据结构解构匹