- Namesrv:无状态,可集群部署,横向扩展
- 每个broker(包括master和slave)在启动的时候向namesrv注册自己
- Producer发送消息的时候根据topic从namesrv中获取路由到broker的信息(根据namesrv的注册信息)
- Consumer根据topic到namesrv获取topic的路由到broker的信息
Namesrv流程图:
namesrv启动时做了哪些事情:
- 加载Netty的server的配置项(NettyServerConfig),namesrv使用Netty与其他模块进行通信,比如和broker模块进行通信。
- 设置监听端口:9876
- 初始化服务控制对象NamesrvController。NamesrvController实例中包含:namesrvConfig(namesrv相关配置),nettyServerConfig(netty的相关配置),KVConfigManager(KV配置管理),RouteInfoManager(路由信息、topic信息管理),BrokerHousekeepingService(broker管理服务)
- NamesrvController.initialize():加载KV配置;初始化通信层(Netty的初始化:remotingServer对象);初始化线程池(remotingExecutor);定义RequestCode用来作为netty的通信协议字段(registerProcessor():向remotingServer对象中注册DefaultRequestProcessor(namesrv中处理请求的类)对象);启动定时扫描notActive的broker任务;启动定时将configTable相关信息记录到日志文件中任务
- 设置一个jvm退出勾子函数,即jvm退出时,此处线程调用controller.shutdown(),清理controller相关资源