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

相关文章

MySQL游标和触发器的操作流程

《MySQL游标和触发器的操作流程》本文介绍了MySQL中的游标和触发器的使用方法,游标可以对查询结果集进行逐行处理,而触发器则可以在数据表发生更改时自动执行预定义的操作,感兴趣的朋友跟随小编一起看看... 目录游标游标的操作流程1. 定义游标2.打开游标3.利用游标检索数据4.关闭游标例题触发器触发器的基

检查 Nginx 是否启动的几种方法

《检查Nginx是否启动的几种方法》本文主要介绍了检查Nginx是否启动的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学... 目录1. 使用 systemctl 命令(推荐)2. 使用 service 命令3. 检查进程是否存在4

解决idea启动项目报错java: OutOfMemoryError: insufficient memory

《解决idea启动项目报错java:OutOfMemoryError:insufficientmemory》:本文主要介绍解决idea启动项目报错java:OutOfMemoryError... 目录原因:解决:总结 原因:在Java中遇到OutOfMemoryError: insufficient me

SpringBoot项目整合Netty启动失败的常见错误总结

《SpringBoot项目整合Netty启动失败的常见错误总结》本文总结了SpringBoot集成Netty时常见的8类问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录一、端口冲突问题1. Tomcat与Netty端口冲突二、主线程被阻塞问题1. Netty启动阻

SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)

《SpringBoot整合Kafka启动失败的常见错误问题总结(推荐)》本文总结了SpringBoot项目整合Kafka启动失败的常见错误,包括Kafka服务器连接问题、序列化配置错误、依赖配置问题、... 目录一、Kafka服务器连接问题1. Kafka服务器无法连接2. 开发环境与生产环境网络不通二、序

Java JAR 启动内存参数配置指南(从基础设置到性能优化)

《JavaJAR启动内存参数配置指南(从基础设置到性能优化)》在启动Java可执行JAR文件时,合理配置JVM内存参数是保障应用稳定性和性能的关键,本文将系统讲解如何通过命令行参数、环境变量等方式... 目录一、核心内存参数详解1.1 堆内存配置1.2 元空间配置(MetASPace)1.3 线程栈配置1.

在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)

《在DataGrip中操作MySQL完整流程步骤(从登录到数据查询)》DataGrip是JetBrains公司出品的一款现代化数据库管理工具,支持多种数据库系统,包括MySQL,:本文主要介绍在D... 目录前言一、登录 mysql 服务器1.1 打开 DataGrip 并添加数据源1.2 配置 MySQL

Nginx分布式部署流程分析

《Nginx分布式部署流程分析》文章介绍Nginx在分布式部署中的反向代理和负载均衡作用,用于分发请求、减轻服务器压力及解决session共享问题,涵盖配置方法、策略及Java项目应用,并提及分布式事... 目录分布式部署NginxJava中的代理代理分为正向代理和反向代理正向代理反向代理Nginx应用场景

Spring Boot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)

《SpringBoot分层架构详解之从Controller到Service再到Mapper的完整流程(用户管理系统为例)》本文将以一个实际案例(用户管理系统)为例,详细解析SpringBoot中Co... 目录引言:为什么学习Spring Boot分层架构?第一部分:Spring Boot的整体架构1.1

nodejs打包作为公共包使用的完整流程

《nodejs打包作为公共包使用的完整流程》在Node.js项目中,打包和部署是发布应用的关键步骤,:本文主要介绍nodejs打包作为公共包使用的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言一、前置准备二、创建与编码三、一键构建四、本地“白嫖”测试(可选)五、发布公共包六、常见踩坑提醒