RocketMQ: Broker启动和NameSrv启动

RocketMQ: Broker启动和NameSrv启动,第1张

RocketMQ: Broker启动和NameSrv启动 前言

因为目前个人涉及到项目大量使用过消息队列,解耦削峰异步的思想,完美解决了实际的处理问题让人大呼真香! 为了更好的理解这个这种类型,所以在此记录研究中间件源码的心路历程。网上有太多比对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,在启动的时候设置如下的命令:

h: print help 打印命令;

n: name srv addr 地址(貌似是被废弃了);

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。

 

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5688721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存