RocketMQ源码笔记(学习更新中)

RocketMQ源码笔记

本文是学习 “RoecketMQ技术内幕” 时的学习笔记,中间会贴上部分dubug源码的调试结果。

2 NameServer

2.1 NameServer 架构设计

Broker消息服务器在启动时,向所有NameServer注册,Producer在发送消息之前从NameServer获取broker服务器地址列表,然后根据负载均衡算法从列表中选择一台消息服务器进行消息发送。NameServer和每台broker服务器保持长连接,每隔30s检测broker是否存活,如果监测到宕机则从路由注册表中将其移除。但是路由变动不会立刻通生产者,为了降低NameServer实现的复杂性,在消息发送端提供容错机制来保证消息发送的高可用。

NameServer彼此之间互不通信,NameServer服务器之间在某一时候的数据并不会完全相同。

2.2 NameServer启动流程

2.2.1:装载配置文件
        final NamesrvConfig namesrvConfig = new NamesrvConfig();
        final NettyServerConfig nettyServerConfig = new NettyServerConfig();
        nettyServerConfig.setListenPort(9876);
        if (commandLine.hasOption('c')) {
   
            String file = commandLine.getOptionValue('c');
            if (file != null) {
   
                InputStream in = new BufferedInputStream(new FileInputStream(file));
                properties = new Properties();
                properties.load(in);
                MixAll.properties2Object(properties, namesrvConfig);
                MixAll.properties2Object(properties, nettyServerConfig);

                namesrvConfig.setConfigStorePath(file);

                System.out.printf("load config properties file OK, %s%n", file);
                in.close();
            }
        }

启动的时候,创建 NamesrvConfig 和 NettyServerConfig ,如果命令行有 -c 参数(加载配置文件),则读入参数,并把Netty 服务器在9876端口启动。

NamesrvConfig:源码

// rocketmq主路径
private String rocketmqHome = System.getProperty(MixAll.ROCKETMQ_HOME_PROPERTY, System.getenv(MixAll.ROCKETMQ_HOME_ENV));
// 存储KV配置属性的持久化路径
private String kvConfigPath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "kvConfig.json";
// 默认config文件路径,不生效
private String configStorePath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "namesrv.properties";

NettyServerConfig:配置

RocketmqNamesrvConsole - listenPort=9876
// serverWorkerThreads: Netty业务线程池线程个数
RocketmqNamesrvConsole - serverWorkerThreads=8
// Netty public任务线程池线程个数, Netty 网络设计,根据业务类型会创建不同的线程池,比如处理消息发送、消息消费、心跳检测等。如果该业务类型(RequestCode)未注册线程池, 则由 public线程池执行。
RocketmqNamesrvConsole - serverCallbackExecutorThreads=0
// IO线程池线程个数,主要是NameServer、Broker端解析请求、返回相应的线程个数,这类线程主要是处理网络请求的,解析请求包,然后转发到各个业务线程池完成具体的业务操作,然后将结果再返回调用方 。
RocketmqNamesrvConsole - serverSelectorThreads=3
// serverOnewaySemaphoreValue: send oneway 消息请求井发度(Broker端参数) 。
RocketmqNamesrvConsole - serverOnewaySemaphoreValue=256
// serverAsyncSemaphoreValue: 异步消息发送最大并发度( Broker 端参数) 。
RocketmqNamesrvConsole - serverAsyncSemaphoreValue=64
// serverChannelMaxldleTimeSeconds:网络连接最大空闲时间,默认120s。如果连接空闲时间超过该参数设置的值,连接将被关闭 。
RocketmqNamesrvConsole - serverChannelMaxIdleTimeSeconds=120
// serverSocketSndBufSize:网络 socket发送缓存区大小, 默认 64k。
RocketmqNamesrvConsole - serverSocketSndBufSize=65535
// serverSocketRcvBufSize:网络 socket接收缓存区大小 ,默认 64k。
RocketmqNamesrvConsole - serverSocketRcvBufSize=65535
// serverPooledByteBufAllocatorEnable: ByteBuffer是否开启缓存,建议开启 。
RocketmqNamesrvConsole - serverPooledByteBufAllocatorEnable=true
// useEpollNativeSelector: 是否启用EpollIO模型,Linux环境建议开启。
RocketmqNamesrvConsole - useEpollNativeSelector=false
2.2.2 : 启动和初始化NamesrcController
    public boolean initialize() {
   
        this.kvConfigManager.load();
        this.remotingServer = new NettyRemotingServer(this.nettyServerConfig, this.brokerHousekeepingService);
        this.remotingExecutor =
            Executors.newFixedThreadPool(nettyServerConfig.getServerWorkerThreads(), new ThreadFactoryImpl("RemotingExecutorThread_"));
        this.registerProcessor();
      // 下面两个定时任务都称为心跳检测
      // 每隔十秒扫描不活跃的 broker 然后移除
        this.scheduledExecutorService.scheduleAtFixedRate(new Runnable
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值