nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化
配置解析
nsqd的主函數(shù)位于apps/nsqd.go中的main函數(shù)
首先main函數(shù)調(diào)用nsqFlagset和Parse進行命令行參數(shù)集初始化,?
然后判斷version參數(shù)是否存在,若存在,則打印版本號并退出程序
接下來鉤住系統(tǒng)的syscall.SIGINT和syscall.SIGTERM消息,用來阻塞主goroutine防止退出
隨后判斷config參數(shù)是否存在,若存在的話還需進行配置文件的讀取,?
nsq使用toml格式的配置文件,并通過github.com/BurntSushi/toml庫進行配置文件的讀取和解析
如果配置文件存在并且符合toml格式,則調(diào)用cfg.Validate對配置文件的各項進行進一步的合法性檢查。?
主要是檢查配置文件中有關(guān)tls的選項(是否支持以及支持的版本)
配置文件檢查通過后,創(chuàng)建默認(rèn)配置opts,并于命令行參數(shù)和配置文件進行合并。?
合并時用到了github.com/mreiferson/go-options庫。?
若出現(xiàn)沖突,則優(yōu)先級從高到低排序依次是命令行、配置文件和默認(rèn)配置?
使用合并后的參數(shù)集初始化真正的nsqd對象
最后,nsqd對象進行初始化和檢查后,啟動nsqd包的主函數(shù),程序從跳轉(zhuǎn)apps/nsqd.go到nsqd/nsqd.go
初始化
nsqd真正開始運行前需要執(zhí)行nsqd/nsqd.go中的LoadMetadata和PersistMetadata兩個函數(shù)
LoadMetadata
初始化nsqd的LoadMetadata函數(shù)使用atomic包中的方法來保證方法執(zhí)行前和執(zhí)行后isLoading值的改變
元數(shù)據(jù)以json格式保存在nsqd可執(zhí)行文件目錄下的nsqd.%d.dat中。其中%d為代表該程序的ID,?
通過在啟動時的命令行worker-id或者配置文件中的id指定。默認(rèn)ID是通過對主機名散列后獲得。?
因此保證了同一臺機器每次啟動的ID相同。
解析元數(shù)據(jù)的文件得到系統(tǒng)中的存在的topic列表,遍歷topic列表中的每個topic:
,若不合法則忽略
,若不合法則忽略
至此,元數(shù)據(jù)的載入完成
PersistMetadata
PersistMetadata將當(dāng)前的topic和channel信息寫入nsqd.%d.dat文件中,?
主要步驟是忽略#ephemeral結(jié)尾的topic和channel后將topic和channel列表json序列化后寫回文件中
寫入文件時先創(chuàng)建擴展名為tmp的臨時文件,寫入內(nèi)容后并保存后再調(diào)用atomicRename函數(shù)將tmp文件重命名為nsqd.%d.dat。?
其中atomicRename函數(shù)在windows和其他操作系統(tǒng)下實現(xiàn)方式不同,分別位于nsqd/rename_windows.go?
和rename.go中。在Linux下直接調(diào)用了os.Rename函數(shù),而Windows下則使用Win32 API實現(xiàn)了文件的重命名。?
這是因為go的早期版本中Windows下調(diào)用os.Rename函數(shù)時如果重命名后的文件已經(jīng)存在則會失敗。?
這個bug在os: make Rename atomic on Windows中提到,?
并且已經(jīng)在os: windows Rename should overwrite destination file.提交中被修復(fù),?
因此,Golang1.5不存在這一bug
Main
在Main函數(shù)中,nsqd真正開始運行。Main監(jiān)聽tcp,https(如果設(shè)置了相關(guān)參數(shù)),http端口并通過WaitGroupWrapper的Wrap函數(shù)以goroutine方式啟動主要的組件。
其中WaitGroupWrapper是對sync.WaitGroup的簡單包裝
執(zhí)行完Main函數(shù)后,配置和初始化工作全部完成,各個組件啟動運行,而主goroutine會阻塞在<-signalChan處,直到收到中斷程序的信號,隨后執(zhí)行nsqd.Exit函數(shù)。?
Exit函數(shù)將進行socket關(guān)閉等清理工作,隨后結(jié)束整個程序的運行。
轉(zhuǎn)載于:https://www.cnblogs.com/zhangboyu/p/7457061.html
總結(jié)
以上是生活随笔為你收集整理的nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字图像处理(一)2
- 下一篇: 2017.8.31 机器学习各种