RocketMQ源码解析之namesrv启动流程

原创不易,转载请注明出处


前言

从本篇文章开始我们主要介绍下RocketMQ的namesrv组件并解析其源码,大约有3篇的样子,我们从namesrv启动开始,之后就是消息生产者从namesrv获取topic信息与broker 向namesrv注册,本篇主要是介绍下namesrv 与其启动流程。

1.关于namesrv的介绍

首先我们来看看这张架构图
在这里插入图片描述
broker 启动的时候,会分别向这个三个namesrv 进行注册,然后每30s会向namesrv进行注册(续约,心跳),在注册或者心跳的时候,会将自己里面的topic信息带到namesrv中,需要注意的是它这个注册是循环注册的,可以理解为这个三个namesrv都是单独的服务,没有同步数据的作用,所以注册的时候才需要你循环注册,这样三个namesrv中才会有那写topic信息。
接着消息生产者与消息消费者会定时去namesrv中拉取topic 信息,这样子消息生产者和消息消费者才能知道消息发给哪个broker 与消息找哪个broker要。
好了,到这namesrv最最核心的两个功能就介绍完成了,如果你做过微服务架构项目,可以把它看作一个简单的注册中心,为啥说它简单呢?因为它的高可用实现简单,像zookeeper ,eureka,这种注册中心都是节点之间都是数据同步的,而namesrv是部署多台机器,然后broker注册的时候是循环注册,消息消费者与消息生产者获取topic信息的时候,如果某一台挂了,就换一台namesrv去拉取。

2.namesrv启动源码解析

在namesrv子项目中,我们可以找到一个NamesrvStartup (org.apache.rocketmq.namesrv.NamesrvStartup)类,这个就是它的入口类,直接进入main方法
在这里插入图片描述
在这里插入图片描述
这里主要是两部,一是调用createNamesrvController创建NamesrvControler对象,二是调用start方法启动NamesrvController
我们先来看看创建NamesrvControler 对象的过程

2.1 NamesrvControler 创建

在这里插入图片描述
开始就是解析下命令行参数,后面我们可以看到 创建了2个config对象,还设置了netty监听端口,我们接着往后看
在这里插入图片描述
中间有一段代码是解析启动命令参数的,我们直接略过,接着就是创建NamesrvController对象,我们来看下它 的构造方法
在这里插入图片描述
这里需要注意的是它创建了kvConfigManager,routeInfoManager这两个manager对象,一个是管理kv配置的,一个就是路由信息,也就是topic相关的东西,到这里我们 NamesrvController创建过程就分析完了。

2.2 NamesrvController初始化与启动

接着需要看下start方法了
在这里插入图片描述
这里首先是进行NamesrvController的初始化动作,然后就是添加关闭钩子,最后就是controller的启动动作,我们先来看看初始化干了些啥
在这里插入图片描述
初始化方法首先是调用了kvConfigManager的load方法,这个主要就是将文件里的kv配置加载到内存里,可以想想,kvconfig其实就是存储的一些键值对的配置,然后会有持久化的动作,也就是将内存里面的kv持久化到文件中,在它添加键值对的时候就出触发这个持久化动作,项目一启动的时候再从文件中把那些kv加载到内存中。接下来就是创建远程服务器,这里使用的是netty框架,接着就是创建一个默认是8个线程的线程池,之后就是注册processor,这个processor其实就是服务器收到请求后,看看执行的是什么命令,然后什么命令交给对应的那个processor,之后就是启动两个定时任务,一个是10s执行一次的扫面掉线的broker,一个就是10分钟执行一次打印kvconfig的任务,其实后面还有关于ssl东西,我们这里就不看了。
接着来看下启动方法
在这里插入图片描述
这里主要还是服务器的启动。
这里我们就把初始化与启动流程介绍完了,我们最后来看下这个remotingServer的初始化与启动
在这里插入图片描述
这里像父类传递了2个参数,就是调用的时候使用信号量做限制,单向调用是256,异步调用是64。
接着就是创建ServerBootstrap对象,创建一个默认是4个线程的公共线程池
在这里插入图片描述
接着就是判断是否使用epoll,然后创建不同的EventLoopGroup
在这里插入图片描述
是否使用epoll,要看你是否是linux系统,然后参数,默认是false,接着就是调用jdk的api。
接着我们来看下server启动
在这里插入图片描述
创建了默认8个线程的事件处理组,然后就是netty的ServerBootstrap build的这一堆东西,这些参数就不用说了,backlog=1024(连接队列大小)reuseaddr=true(为了快速启动)nodelay=true(不使用这个算法,为了时效性,用了这个算法发小包的话,它会给你等等攒着一块发)再就是各种buffer了。这里需要注意的是后面这些handler 使用另外一个线程池处理,也就是真正干活的是这个线程池,有连接来的时候boss处理,channel有事件发生的时候 selecter将事件读出来,然后交给EventExecutor来处理。
在这里插入图片描述
后面就是启动了,最后面还有一个任务来扫描responseTable,这个就是异步调用的时候,然后会扫描这个responseTable找出过期的。

总结

好了,到这本篇内容就结束了,主要是介绍了namesrv在RocketMQ担任的角色,以及一些核心功能介绍与高可用的实现,最后是我们分析了一下它启动流程的源码。

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页