歡迎光臨
每天分享高質量文章

RocketMQ學習-NameServer-1

NameServer在RocketMQ中的角色是配置中心,主要有兩個功能:Broker管理、路由管理。因此NameServer上存放的主要資訊也包括兩類:Broker相關的資訊、路由資訊。

NameServer模組的結構如下:

上面這些類之間的依賴關係圖如下圖所示:

可以看出,入口是NamesrvStartup類,name server透過NamesrvController控制器來協調其他功能。

啟動器的主要流程

  1. 使用common-cli包處理命令列引數

  2. 讀取並設定伺服器配置,包括NameServer的配置和NettyServer的配置

  3. 讀取日誌框架配置並初始化日誌框架

  4. 初始化NameServer控制器(註意:NameServer的配置和Netty伺服器的配置為初始化引數)

  5. 設定JVM關閉時的鉤子

知識點

  • 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-essay-headers=/usr/include \
     * --host=x86_64-linux-gnu \ --build=x86_64-pc-linux-gnu \ --without-gd
     */
    private boolean useEpollNativeSelector = false;
    
    //省略getter and setter 
}
  • 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 
}
  • JVM鉤子 JVM可能是正常退出也可能是異常退出,在異常退出的時候開發者希望有工具可以清理現場,這就是JDK 1.3開始提供的關閉鉤子(Shutdown Hook)。關閉鉤子在以下幾個場景下被觸發:最後一個正常執行緒結束、System.exit()、透過平臺特定的方式被關閉、系統斷電。使用關閉鉤子的時候需要避免併發問題,方法是:註冊一個關閉鉤子,順序執行各項清理工作。RMQ中註冊關閉鉤子的程式碼如下:

//設定JVM的關閉鉤子            
Runtime.getRuntime().addShutdownHook(new ShutdownHookThread(log, new Callable() {               
    @Override
    public Void call() throws Exception {
        controller.shutdown();
        //controller.shutdown()中做了什麼事情:關閉Netty服務端、關閉服務執行緒池、關閉排程執行緒池。
        return null;
     }
}));

參考資料

  1. JAVA虛擬機器關閉鉤子(Shutdown Hook)

  2. RocketMQ原始碼分析之NameServer

贊(0)

分享創造快樂