RocketMQ学习-NameServer-1

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向治洪

android ndk之hello world

前言:Android NDK r7及以上的版本已经集成了Cygwin编译环境,也就是说,我们完全可以抛弃庞大的Cygwin了。 r6及以下版本,也可以抛弃几个G...

2755
来自专栏ImportSource

Spring Boot处理REST API错误的正确姿势

如何正确的处理API的返回信息,让返回的错误信息提供更多的含义是一个非常值得做的功能。 默认一般返回的都是难以理解的堆栈信息,然而这些信息也许对于API的客户...

59213
来自专栏云霄雨霁

Java虚拟机--(互斥同步与非阻塞同步)和锁优化

2024
来自专栏崔庆才的专栏

是时候抛弃print了,开始体验下logging的强大吧!

2052
来自专栏向治洪

svn错误对照表

#, c-format msgid "Destination '%s' is not a directory" msgstr "目的 “%s” 不是目录" ...

3315
来自专栏北京马哥教育

一键将 Python2 代码自动转化为 Python3

将下边面的 reg 代码复制另存为“python 2to3.reg”文件,然后双击此文件,导入到注册表。

990
来自专栏向治洪

Elcipse安装gradle插件

参考: http://www.gradle.org/docs/current/userguide/installation.html (1)下载Gradle ...

2168
来自专栏java学习

关于Spring 和 Spring MVC的43个问题【问题汇总】

通过Spring提供的IoC容器,可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所造成的过度程序耦合。

901
来自专栏沃趣科技

MySQL中server_id一致带来的问题

简 介 我们都知道在MySQL搭建复制环境的时候,需要设置每个server的server_id不一致,如果主库与从库的server_id一致,那么复制会失败。...

3896
来自专栏java学习

你竟敢说你懂Spring框架?有可能你是没看到这些...(上)

所以,特地去搜刮了一些关于spring的面试题,希望能帮助各位同学在升职加薪的路上,一去不复返。

1142

扫码关注云+社区

领取腾讯云代金券