Namesrv啟動流程
第一步:腳本和啟動參數(shù)配置。
啟動命令 nohup ./bin/mqnamesrv -c ./conf/namesrv.conf > dev/null 2>&1 &
通過腳本配置啟動基本參數(shù),比如配置文件路徑、JVM參數(shù),調(diào)用NamesrvStartup.main()方法,解析命令行的參數(shù),將處理好的參數(shù)轉(zhuǎn)化為Java實例,傳遞給NamesrvController實例
第二步:new 一個NamesrvController
加載命令行傳遞的配置參數(shù),調(diào)用controller.initialize()方法初始化NamesrvController。
Namesrv啟動的主要初始化過程也在這個方法中,代碼如圖
1.加載KV配置。主要是從本地文件中加載KV配置到內(nèi)存中
2.初始化Netty通信層實例。RocketMQ基于Netty實現(xiàn)了一個RPC服務(wù)端,即NettyRemotingServer.通過參數(shù)nettyServerConfig,
會啟動9876端口監(jiān)聽
3.Namesrv主動檢測Broker是否可用,如果不可用就剔除。生產(chǎn)者、消費者也能通過心跳發(fā)現(xiàn)被踢出的路由,從而感知Broker下線
4.Namesrv定時打印配置信息到日志中。
第三步:NamesrvController在初始化后添加JVM Hook.Hook中會調(diào)用NamesrvController.shutdown()方法來關(guān)閉整個Namesrv服務(wù)
第四步:調(diào)用NamesrvController.start()方法,啟動整個Namesrv。其實start()方法只啟動了Namesrv接口處理線程池
Namesrv關(guān)閉流程
為什么需要了解停止流程呢?RocketMQ在設(shè)計之初已經(jīng)考慮了很多異常情況,比如Namesrv異常退出、突然斷電、內(nèi)存被打滿等等,只有了解了正常的停止流程才能對異常退出導(dǎo)致的問題進(jìn)行精確的分析和排障。
通常Namesrv的停止是通過關(guān)閉命令./mqshutdown namesrv來實現(xiàn)的。這個命令通過調(diào)用kill命令將關(guān)閉進(jìn)程通知發(fā)給JVM,JVM調(diào)用觀級Hook執(zhí)行停止邏輯。具體實現(xiàn)如下文章來源:http://www.zghlxwxcb.cn/news/detail-829286.html
1.關(guān)閉Netty服務(wù)端,主要是關(guān)閉Netty事件處理器、時間監(jiān)聽器等全部已經(jīng)初始化的組件
2.關(guān)閉Namesrv接口處理線程池
3.關(guān)閉全部已經(jīng)啟動的定時任務(wù)文章來源地址http://www.zghlxwxcb.cn/news/detail-829286.html
到了這里,關(guān)于消息中間件之RocketMQ源碼分析(十)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!