美文网首页程序员@IT·互联网
RocketMQ学习-NameServer-1

RocketMQ学习-NameServer-1

作者: 程序熊大 | 来源:发表于2018-03-21 23:05 被阅读650次

    NameServer在RocketMQ中的角色是配置中心,主要有两个功能:Broker管理、路由管理。因此NameServer上存放的主要信息也包括两类:Broker相关的信息、路由信息。

    NameServer模块的结构如下:

    name server代码结构

    上面这些类之间的依赖关系图如下图所示:

    name server类图

    可以看出,入口是NamesrvStartup类,name server通过NamesrvController控制器来协调其他功能。

    启动器的主要流程

    1. 使用common-cli包处理命令行参数
    2. 读取并设置服务器配置,包括NameServer的配置和NettyServer的配置
    3. 读取日志框架配置并初始化日志框架
    4. 初始化NameServer控制器(注意:NameServer的配置和Netty服务器的配置为初始化参数)
    5. 设置JVM关闭时的钩子

    知识点

    1. NettyServerConfig,rmq中用于配置Netty服务器的配置文件,这里对于Netty线程模型不展开讲。
    public class NettyServerConfig implements Cloneable {
        //监听的端口
        private int listenPort = 8888;
        //服务器工作线程数
        private int serverWorkerThreads = 8;
        //服务器回调执行线程数
        private int serverCallbackExecutorThreads = 0;
        //服务器选择线程数
        private int serverSelectorThreads = 3;
        //单向信号量
        private int serverOnewaySemaphoreValue = 256;
        //异步信号量
        private int serverAsyncSemaphoreValue = 64;
        //通道的最大空余时间(秒)
        private int serverChannelMaxIdleTimeSeconds = 120;
    
        private int serverSocketSndBufSize = NettySystemConfig.socketSndbufSize;
        private int serverSocketRcvBufSize = NettySystemConfig.socketRcvbufSize;
        private boolean serverPooledByteBufAllocatorEnable = true;
    
        /**
         * make make install
         *
         *
         * ../glibc-2.10.1/configure \ --prefix=/usr \ --with-headers=/usr/include \
         * --host=x86_64-linux-gnu \ --build=x86_64-pc-linux-gnu \ --without-gd
         */
        private boolean useEpollNativeSelector = false;
        
        //省略getter and setter 
    }
    
    1. NameServerConfig
    public class NamesrvConfig {
        private static final Logger log = LoggerFactory.getLogger(LoggerName.NAMESRV_LOGGER_NAME);
        //rmq的家目录
        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";
        //namesrv的配置文件的存放路径
        private String configStorePath = System.getProperty("user.home") + File.separator + "namesrv" + File.separator + "namesrv.properties";
        private String productEnvName = "center";
        private boolean clusterTest = false;
        //是否开启顺序消息特性
        private boolean orderMessageEnable = false;
    
        //省略getter and setter 
    }
    
    1. JVM钩子
      JVM可能是正常退出也可能是异常退出,在异常退出的时候开发者希望有工具可以清理现场,这就是JDK 1.3开始提供的关闭钩子(Shutdown Hook)。关闭钩子在以下几个场景下被触发:最后一个正常线程结束、System.exit()、通过平台特定的方式被关闭、系统断电。使用关闭钩子的时候需要避免并发问题,方法是:注册一个关闭钩子,顺序执行各项清理工作。RMQ中注册关闭钩子的代码如下:
    //设置JVM的关闭钩子            
    Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(log, new Callable<Void>() {               
        @Override
        public Void call() throws Exception {
            controller.shutdown();
            //controller.shutdown()中做了什么事情:关闭Netty服务端、关闭服务线程池、关闭调度线程池。
            return null;
         }
    }));
    

    参考资料

    1. JAVA虚拟机关闭钩子(Shutdown Hook)
    2. RocketMQ源码分析之NameServer

    相关文章

      网友评论

        本文标题:RocketMQ学习-NameServer-1

        本文链接:https://www.haomeiwen.com/subject/dvbnqftx.html