因为目前个人涉及到项目大量使用过消息队列,解耦削峰异步的思想,完美解决了实际的处理问题让人大呼真香! 为了更好的理解这个这种类型,所以在此记录研究中间件源码的心路历程。网上有太多比对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。
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处理业务。Netty Server启动端口为9876。
NamesrvConfig则是有两个地址kvConfigPath是namesrv目录下的kvConfig.json; configStorePath是namesrv目录下的namesrv.properties。
3. 实例化Name-SrvController
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)