RocketMQ(一): Broker启动和NameSrv启动

目录

前言

一. Name-Srv 启动流程

二. Broker启动流程


前言

因为目前个人涉及到项目大量使用过消息队列,解耦削峰异步的思想,完美解决了实际的处理问题让人大呼真香! 为了更好的理解这个这种类型,所以在此记录研究中间件源码的心路历程。网上有太多比对RocketMQ和Kafka的对比文章,虽然吞吐量RocketMQ在吞吐量相比Kafka实在拉胯,但是RocketMQ也开辟基于业务适合自己的赛道,用四个字总结就是简单高效。研读源码不是为了内卷,而是为了学习他人的优点。所以让我们开始这次MQ的学习历程!

一. Name-Srv 启动流程

RocketMq没有模仿Kafka使用Zookeeper的注册中心,而是自己实现了自己的注册中心。对于这点个人还是比较赞同的,首先排除了运维和部署的复杂程度,其次删繁就简消息中间件只想要个元数据管理有时候不需要类似Zookeeper那些复杂的功能,Name-Srv实现自己的AP即可用性(Availability) 和 分区容错性 (Partiton Tolerance),可用性则是通过心跳活跃延时处理方案来保证,分区容错性则是通过分布式部署,至于后续Rocketmq也实现了基于Raft协议的一致性框架DLedger加强了Rocketmq的高可用性。

接下来我们来细细研究一下Name-Srv,首先Name-Srv启动是通过Shell语句执行Java的环境以及启动到Name-Srv的main函数这个入口,Name-Srv支持命令行的来配置属性。Name-Srv就干了两件事创建NameSrvController和启动NameSrvController,之后的Broker也是类似的套路。

启动流程主要运用到Java两个原生方法: System.getenv 和 System.getProperty。前者设置获取环境变量,后者设置获取系统属性;前者可在Idea中Environment variables设置,后者则是使用属性命令行参数方式传递: java -jar jarName -DParam = ParamValue。RocketMq这个所有有关存放位置等系统级别参数都基于此方法来的。

创建NameSrvController方法在源码的createNamesrvController方法里,第一步先添加指令,第二步实例化NamesrvConfig和NettyServerConfig  第三步实例化NameSrvController  第四步初始化NameSrvController并启动

 1. 添加命令是基于Apache Common-cli 的Options,在启动的时候设置如下的命令:

命令说明
hprint help 打印命令
nname srv addr 地址(Broker用到)
c配置文件加载(使用文件形式来配置netty和name-srv配置)
p打印配置

2. 实例化NamesrvConfig和NettyServerConfig 

RocketMq底层是基于Netty来通信的,所以无法避免需要这些配置。RocketMq使用netty的React多线程模型。Boss线程数为1,selector线程数为3,worker线程数为8处理业务,oneWay操作并发256,异步发送并发64。Netty Server启动端口为9876。

NamesrvConfig则是有两个地址kvConfigPath是namesrv目录下的kvConfig.json; configStorePath是namesrv目录下的namesrv.properties。

3. 实例化NameSrvController

实例化NameSrvController除了KVConfigManager配置之外有个重要的配置就是RouteInfoManager。此配置是管理Rocketmq的broker地址和集群broker等。

 此图为RouteInfoManager的broker管理关系。

4. 初始化NameSrvController并启动

初始化的NameSrv除了配置selector线程和,最重要的一点就是注册Processor,默认的DefultRequestProcessor。和Broker通信的操作皆出自该Processor。

二. Broker启动流程

Broker的启动流程也大致和Name-Srv相似,第一步添加解析指令,第二步初始化BrokerConfig配置,因为Broker既是服务端也是客户端所以第三步要初始化NettyServerConfig和NettyClientConfig,第四步是MessageStoreConfig消息配置。

1.添加解析指令

2. 初始化BrokerConfig 

BrokerConfig主要是线程池的配置,Broker的地址管理等。

3.初始化NettyServerConfig和NettyClientConfig

 NettyServerConfig在Name-Srv启动已经讲过,用的同一份配置信息但是NettyServer启动端口为10911,高可用端口为10912。Broker作为存储+服务端+客户端集一身,因此在客户端的配置NettyClientConfig配置如下。

4. 初始化MessageStoreConfig 

 Broker的存储配置太多就不一一展开。

5.实例化BrokerController和初始化BrokerController

Broker实例化诸多管理器和队列。 

接下来的就是初始化BrokerController,加载持久化的offset  topic consumer信息等。

BrokerController在初始化的时候需要做一件事就是加载CommitLog和Consume Queue。CommitLog是消息存储的重要组成部分,Consume Queue是消费者使用到消费消息的队列。

​​​​​​​

 

 将Name-Srv地址存到Broker的内存中进行管理。

 BrokerController启动会创建一个定时任务每30秒去向NameSrv注册信息并且创建Topic。Topic的配置信息则是在发送消息的抽象类msgCheck中去注册到内存中,Broker注册的时候再取出来注册进NameSrv中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值