日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化

發(fā)布時(shí)間:2024/4/14 编程问答 57 豆豆
生活随笔 收集整理的這篇文章主要介紹了 nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

配置解析

nsqd的主函數(shù)位于apps/nsqd.go中的main函數(shù)

首先main函數(shù)調(diào)用nsqFlagset和Parse進(jìn)行命令行參數(shù)集初始化,?
然后判斷version參數(shù)是否存在,若存在,則打印版本號(hào)并退出程序

接下來(lái)鉤住系統(tǒng)的syscall.SIGINT和syscall.SIGTERM消息,用來(lái)阻塞主goroutine防止退出

隨后判斷config參數(shù)是否存在,若存在的話還需進(jìn)行配置文件的讀取,?
nsq使用toml格式的配置文件,并通過(guò)github.com/BurntSushi/toml庫(kù)進(jìn)行配置文件的讀取和解析

如果配置文件存在并且符合toml格式,則調(diào)用cfg.Validate對(duì)配置文件的各項(xiàng)進(jìn)行進(jìn)一步的合法性檢查。?
主要是檢查配置文件中有關(guān)tls的選項(xiàng)(是否支持以及支持的版本)

配置文件檢查通過(guò)后,創(chuàng)建默認(rèn)配置opts,并于命令行參數(shù)和配置文件進(jìn)行合并。?
合并時(shí)用到了github.com/mreiferson/go-options庫(kù)。?
若出現(xiàn)沖突,則優(yōu)先級(jí)從高到低排序依次是命令行、配置文件和默認(rèn)配置?
使用合并后的參數(shù)集初始化真正的nsqd對(duì)象

最后,nsqd對(duì)象進(jìn)行初始化和檢查后,啟動(dòng)nsqd包的主函數(shù),程序從跳轉(zhuǎn)apps/nsqd.go到nsqd/nsqd.go

初始化

nsqd真正開(kāi)始運(yùn)行前需要執(zhí)行nsqd/nsqd.go中的LoadMetadata和PersistMetadata兩個(gè)函數(shù)

LoadMetadata

初始化nsqd的LoadMetadata函數(shù)使用atomic包中的方法來(lái)保證方法執(zhí)行前和執(zhí)行后isLoading值的改變

元數(shù)據(jù)以json格式保存在nsqd可執(zhí)行文件目錄下的nsqd.%d.dat中。其中%d為代表該程序的ID,?
通過(guò)在啟動(dòng)時(shí)的命令行worker-id或者配置文件中的id指定。默認(rèn)ID是通過(guò)對(duì)主機(jī)名散列后獲得。?
因此保證了同一臺(tái)機(jī)器每次啟動(dòng)的ID相同。

解析元數(shù)據(jù)的文件得到系統(tǒng)中的存在的topic列表,遍歷topic列表中的每個(gè)topic:

  • 檢查topic名稱是否合法(長(zhǎng)度在1-64之間,滿足正則表達(dá)式^[\.a-zA-Z0-9_-]+(#ephemeral)?$)?
    ,若不合法則忽略
  • 使用GetTopic函數(shù)通過(guò)名字獲得topic對(duì)象
  • 判斷當(dāng)前topic對(duì)象是否處于暫停狀態(tài),是的話調(diào)用Pause函數(shù)暫停topic
  • 獲取當(dāng)前topic下所有的channel,并且遍歷channel,執(zhí)行的操作與topic基本一致?
  • 檢查channel名稱是否合法(長(zhǎng)度在1-64之間,滿足正則表達(dá)式^[\.a-zA-Z0-9_-]+(#ephemeral)?$)?
    ,若不合法則忽略
  • 使用GetChannel函數(shù)通過(guò)名字獲得channel對(duì)象
  • 判斷當(dāng)前channel對(duì)象是否處于暫停狀態(tài),是的話調(diào)用Pause函數(shù)暫停channel
  • 至此,元數(shù)據(jù)的載入完成

    PersistMetadata

    PersistMetadata將當(dāng)前的topic和channel信息寫(xiě)入nsqd.%d.dat文件中,?
    主要步驟是忽略#ephemeral結(jié)尾的topic和channel后將topic和channel列表json序列化后寫(xiě)回文件中

    寫(xiě)入文件時(shí)先創(chuàng)建擴(kuò)展名為tmp的臨時(shí)文件,寫(xiě)入內(nèi)容后并保存后再調(diào)用atomicRename函數(shù)將tmp文件重命名為nsqd.%d.dat。?
    其中atomicRename函數(shù)在windows和其他操作系統(tǒng)下實(shí)現(xiàn)方式不同,分別位于nsqd/rename_windows.go?
    和rename.go中。在Linux下直接調(diào)用了os.Rename函數(shù),而Windows下則使用Win32 API實(shí)現(xiàn)了文件的重命名。?
    這是因?yàn)間o的早期版本中Windows下調(diào)用os.Rename函數(shù)時(shí)如果重命名后的文件已經(jīng)存在則會(huì)失敗。?
    這個(gè)bug在os: make Rename atomic on Windows中提到,?
    并且已經(jīng)在os: windows Rename should overwrite destination file.提交中被修復(fù),?
    因此,Golang1.5不存在這一bug

    Main

    在Main函數(shù)中,nsqd真正開(kāi)始運(yùn)行。Main監(jiān)聽(tīng)tcp,https(如果設(shè)置了相關(guān)參數(shù)),http端口并通過(guò)WaitGroupWrapper的Wrap函數(shù)以goroutine方式啟動(dòng)主要的組件。

    其中WaitGroupWrapper是對(duì)sync.WaitGroup的簡(jiǎn)單包裝

    執(zhí)行完Main函數(shù)后,配置和初始化工作全部完成,各個(gè)組件啟動(dòng)運(yùn)行,而主goroutine會(huì)阻塞在<-signalChan處,直到收到中斷程序的信號(hào),隨后執(zhí)行nsqd.Exit函數(shù)。?
    Exit函數(shù)將進(jìn)行socket關(guān)閉等清理工作,隨后結(jié)束整個(gè)程序的運(yùn)行。

    轉(zhuǎn)載于:https://www.cnblogs.com/zhangboyu/p/7457061.html

    總結(jié)

    以上是生活随笔為你收集整理的nsq源码阅读笔记之nsqd(一)——nsqd的配置解析和初始化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。