RocketMQ源码阅读笔记-NameSrv功能解析

NameServer是RocketMQ的路由管理、服务注册与服务发现中心,首先简要说明一下NameServer的主要功能:

  • 所有的Broker服务器会向所有的nameServer注册自己的信息
  • 消息生产者(Producer)在发送消息时,也会向NameServer请求Broker服务器的地址信息,然后从中选择一台broker服务器进行消息发送
  • NameServer会与Broker服务器保持一个连接,接收Broker定时发送回来的心跳信息,如果超过一定时间没收到心跳,那么NameServer将会删除该Broker的路由注册信息,但是有一点要注意,NameServer在删除了某个Broker服务器的路由信息后,并不会主动去通知消息生产者producer,producer自己有一套机制去发现发送消息的Broker服务器已失效,后续在解析生产者代码时会解析。
  • 消费者在消费消息之前,也需要向NameServer请求当前存在的Broker服务器,从而进行消息的订阅与消费

NameServer的启动

NameServer的主要功能都在NamesrvController类中,该类内定义了如下的对象,大致罗列了所有对象的基本功能:

//日志
private static final InternalLogger log = InternalLoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
//NameServer的配置信息
private final NamesrvConfig namesrvConfig;
//NameServer模块内嵌的Netty服务器的参数
private final NettyServerConfig nettyServerConfig;
 //线程池,用于运行一些定时任务
private final ScheduledExecutorService scheduledExecutorService = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryImpl(
    "NSScheduledThread"));
//维护NameServer的一些k-v键值对
private final KVConfigManager kvConfigManager;
//维护NameServer的所有路由信息,包括topic的队列信息、Broker的地址等
private final RouteInfoManager routeInfoManager;
//NameServer用于收发消息,接受连接请求的Netty服务器,
private RemotingServer remotingServer;
//处理Broker与NameServer连接状态的一些响应函数
private BrokerHousekeepingService brokerHousekeepingService;
//处理接收到消息的线程池,该线程池执行的代码在对应的processor中
private ExecutorService remotingExecutor;
//NameServer的配置信息类,包括NameServer和NettyServer信息的持久化保存
private Configuration configuration;
//检测认证文件的服务
private FileWatchService fileWatchService;

NameServer启动时,首先通过createNamesrvController方法创建一个NamesrvController对象,后续的所有操作都是通过该对象来进行。NamesrvController首先调用initialize方法完成对象的初始化,主要包括:

  • this.kvConfigManager.load();加载键值对文件

  • this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.brokerHousekeepingService);创建Netty服务器,在创建该服务器时,会传入一个BrokerHouseKeepingService对象,该对象首先了一系列channel状态变化时的响应函数,这样在Broker服务器与NameServer网络连接状态发生变化时,BrokerHouseKeepingService对象对应的响应方法将会执行。

  • 创建线程池,并定义了两个定时操作,分别是扫描失活的broker服务器和打印NameServer维护的键值对信息。

this.remotingExecutor =
    Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(), new ThreadFactoryImpl("RemotingExecutorThread_"));
this.registerProcessor();
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable() {
   
    @Override
    public void run() {
   
        NamesrvController.this.routeInfoManager.scanNotActiveBroker();
    }
}, 5, 10, TimeUnit.SECONDS);
this.scheduledExecutorService.scheduleAtFixedRate(new Runnable(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
RocketMQ是一个开源的分布式消息中间件,由阿里巴巴开发,主要用于大规模的消息传输和处理。阅读RocketMQ源码可以帮助你深入了解其内部工作机制、设计模式以及优化策略。以下是阅读RocketMQ源码的一些步骤和关键点: 1. **入门准备**: - 安装必要的依赖:首先需要对Java和相关开发环境(如Maven或Gradle)有一定了解。 - 了解项目结构:熟悉RocketMQ的代码仓库结构,主要包括`mq-client`, `mq-common`, `mq-server`, `mq-externalservice`等主要模块。 2. **理解设计思想**: - 分布式系统设计:研究分区、集群、消息路由、故障恢复机制。 - 消息模型:Consumer Group, Topic, Queue, Orderly Consumers等概念。 - 事务一致性:检查如何处理消息的事务性和持久化。 3. **核心组件**: - **Broker**:查看消息的存储、消费分发、事务管理和高可用性实现。 - **Producer**:了解消息发送流程,包括序列化、路由选择、发送确认机制。 - **Consumer**:研究拉取消费模式和顺序消费的实现。 4. **关键技术实现**: - **Message Queueing(MQ)**:学习如何使用队列来存储和分发消息。 - **Reentrant Locks**:查看并发控制的使用。 - **高可用和容错**:关注心跳检测、主备切换、网络重试策略等。 5. **查阅文档和注释**: - 阅读官方文档、API文档和开发者指南,有助于理解源码中各种类和方法的作用。 - 源码中的JavaDoc是非常重要的参考资料。 6. **实践与问题跟踪**: - 尝试在本地搭建并运行RocketMQ,通过实际操作发现问题。 - 查阅GitHub上的issue和PR,了解社区对源码的讨论和改进。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值