RocketMQ 4.9.3源码解读-NameServer启动流程分析

#技术栈深潜计划:原理解析&编程技巧深度探索征文活动#

作者源码阅读笔记主要采用金山云文档记录的,所有的交互图和代码阅读笔记都是记录在云文档里面,本平台的文档编辑实在不方便,会导致我梳理的交互图和文档失去原来的格式,所以整理在文档里面,供大家阅读交流

【金山文档 | WPS云文档】 namesrv 启动流程

相关重要类介绍说明

请求处理组件NamesrvController类

名称

描述

默认值

namesrvConfig

主要包含了 NameServer 自身运行的参数

nettyServerConfig

主要包含了 Netty 服务端的配置参数

routeInfoManager

路由管理器组件

scheduledExecutorService

调度线程池,执行定时任务,两件事:1. 检查存活的broker状态 2. 打印配置

kvConfigManager

管理kv配置

remotingServer

网络层封装对象

brokerHousekeepingService

ChannelEventListener ,用于监听channel 状态,当channel状态 发生改变时 close idle... 会向 事件队列发起事件,事件最终由 该service处理

remotingExecutor

业务线程池,netty 线程 主要任务是 解析报文 将 报文 解析成 RemotingCommand 对象,然后 就将 该对象 交给 业务 线程池 再继续处理

NamesrvConfig配置类

名称

描述

默认值

rocketmqHome

RocketMQ的主目录

rocketmq.home.dir

kvConfigPath

NameServer 存储 KV 配置属性的文件地址

user.home/namesrv/kvconfig.json

configStorePath

默认配置文件的地址,指定配置文件启动通过-c configPath 命令

user.home/namesrv/namesrv.properties

productEnvName

生产环境名称

center

clusterTest

是否启动集群测试,默认不开启

false

orderMessageEnable

是否支持有序消息,默认不支持

false

NettyServerConfig 配置类

名称

描述

默认值

listenPort

监听端口,下面启动时被默认覆盖为9876

8888

serverWorkerThreads

Netty工作线程数

8

serverCallbackExecutorThreads

Netty的public线程池的线程数,默认是0

0

serverSelectorThreads

Netty的IO线程池线程数量。主要负责处理网络请求,解析请求包,再转发到各个业务线程池。最后返回结果

3

serverOnewaySemaphoreValue

Broker端的两个配置参数

sendOneWay 消息请求的最大并发度

256

serverAsyncSemaphoreValue

Broker端的两个配置参数

异步消息发送的最大并发数

64

serverChannelMaxIdleTimeSeconds

网络连接最大空闲时间默认120s,超过该空闲时间的连接被关闭

120s

serverSocketSndBufSize

网络Socket发送缓冲区大小 默认64KB

64KB

serverSocketRcvBufSize

接收端缓存区大小 默认64KB

64KB

serverPooledByteBufAllocatorEnable

是否开启 ByteBuffer 缓存,默认开启

true

useEpollNativeSelector

是否启用Epoll模型,Linux 下默认是开启的

false

RouteInfoManager路由管理器

名称

描述

默认值

BROKER_CHANNEL_EXPIRED_TIME

broker channel 过期时间

1000 * 60 * 2

topicQueueTable

topic 消息队列的路由信息,Produer 就根据该路由表进行负载均衡的发送消息

HashMap<String/* topic */, List<QueueData>> topicQueueTable

brokerAddrTable

broker节点地址表

HashMap<String/* brokerName */, BrokerData>

clusterAddrTable

集群地址表

HashMap<String/* clusterName */, Set<String/* brokerName */>> clusterAddrTable

brokerLiveTable

broker节点存活表

HashMap<String/* brokerAddr */, BrokerLiveInfo> brokerLiveTable

备注:Broker每30s 发一次心跳,NameServer 收到心跳后,就会将对应的时间戳保存到该 Broker 下的状态信息中,用于后面每10s 扫描判断是否超过120s 未收到心跳

filterServerTable

HashMap<String/* brokerAddr */, List<String>/* Filter Server */>

DefaultRequestProcessor 网络请求处理器

该处理器就是专门负责处理 NameServer 收到的网络请求,对应的方法为processRequest

模块

requestCode

处理方法

描述

  • KV配置相关的(添加、获取、删除)

100

putKVConfig()

添加KV配置

101

getKVConfig()

查询KV配置

102

deleteKVConfig()

删除KV配置

219

getKVListByNamespace()

通过命名空间获取KV配置集

  • broker节点相关(注册、注销下线)

103

  1. 高于V3_0_11版本

registerBrokerWithFilterServer()

  1. 低于V3_0_11版本

registerBroker()

注册broker节点信息

104

unregisterBroker()

注销下线broker节点信息

  • 根据topic获取路由信息

105

getRouteInfoByTopic()

根据topic获取路由信息

  • 获取broker集群信息

106

getBrokerClusterInfo()

获取所有broker节点集群信息

  • 擦除Broker的写权限

205

wipeWritePermOfBroker()

主要用于在平滑升级Broker时实现无损停写操作。

  1. 客户端会发送一个停写请求到NameServer
  2. NameServer会将该请求转发给相应的Broker
  3. Broker接收到停写请求后,会停止写操作,并返回确认信息给客户端‌
  • 给broker添加写权限

327

addWritePermOfBroker()

给broker添加写权限

  • TOPIC 相关的(获取所有 topic 列表、删除 topic、获取系统 topic 等等)

206

getAllTopicListFromNameserver()

从NameServer 服务获取所有topic主题列表

216

deleteTopicInNamesrv()

删除NameServer服务上的topic主题

224

getTopicsByCluster()

获取集群中的topic主题列表

304

getSystemTopicListFromNs()

从NameServer服务中获取所有系统主题列表

  • 单元测试TOPIC 相关的

311

getUnitTopicList()

从NameServer服务中获取所有单元测试主题列表

312

getHasUnitSubTopicList()

从NameServer服务中获取所有子单元测试主题列表

313

getHasUnitSubUnUnitTopicList()

...

  • NameServer 配置相关

318

updateConfig()

更新configuration配置

319

getConfig()

获取配置信息

NameServer组件相关流程图整理

NameServer组件结构简略图

NameServer组件RouteInfoManager路由元数据图

NameServer 核心类图

NameServer start()启动流程图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

记忆不曾留

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值