RocketMQ之三:nameserver源码解析
NameServer代码结构
如下图:

如上图所示,nameServer设计比较轻量级的,其中几个主要类的功能为:
NamesrvStartup:从命名就可以看出这为NameServer的启动类。
RouteInfoManager:从类名可以看出为路由信息的管理类,就是存放Broker的状态信息及Topic于Broker的关联关系。如下截图:

DefaultRequestProcessor:类名可看出为处理请求的类,里面封装了对broker发来的各种请求的响应。
NamesrvController:NameServer控制类,管控NameServer的启动、初始化、停止等生命周期。
先看下NamesrvStartup的代码,简要的抽取几点:
final NamesrvConfig namesrvConfig = new NamesrvConfig();
final NettyServerConfig nettyServerConfig = new NettyServerConfig();
nettyServerConfig.setListenPort(9876);
。。。。。。。。。。。。。
final NamesrvController controller = new NamesrvController(namesrvConfig, nettyServerConfig);
controller.getConfiguration().registerConfig(properties);
boolean initResult = controller.initialize();
可以看出NameServer启动时候,初始化了nameServer和netty的配置(可以看出RocketMQ各部分之间的通信使用的netty),并初始化了NameserController。
看下initialize()方法

可以看出初始化了nettyServer,初始化了线程池,注册了请求处理类。

我们先看下broker的注册,在DefaultRequestProcessor类中


上图可以看出为了避免线程安全问题,使用了lock锁。注册过程就是维护RouteInfoManager中的数据结构。
注册broker成功后,就是通过心跳来检测broker的生命周期,维护broker状态信息。
从boolean initResult = controller.initialize();方法中可以看到这一块代码:




图一为初始化调度线程池(单线程),图二初始化后启动调度线程,图三可以看出,调度线程定时的扫描brokerLiveTable里面broker的状态信息,发现最近的更新时间与当前时间相差大于BROKER_CHANNEL_EXPIRED_TIME =1000 *60 *2,即两分钟的话,就删除当前broker,从图四可以看出,删除broker就是删除RouteInfoManager中维护的几个hashmap中关于broker的信息。
NameServer就解析到这里,如果感兴趣,大家不妨看下源码,自己跟下。
作者:big兵
链接:https://www.jianshu.com/p/3d8d594d9161
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
2012-12-28 java中使用公钥加密私钥解密原理实现license控制