摘要:本篇将會結合源碼介紹 nsqlookupd 的實作細節。
本篇将會結合源碼介紹 nsqlookupd 的實作細節。nsqlookupd 主要流程與nsqd 執行邏輯相似,差別在于具體運作的任務不同。
nsqlookupd是nsq管理叢集拓撲資訊以及用于注冊和發現nsqd服務。是以,也可以把nsqlookupd了解為注冊發現服務。當nsq叢集中有多個nsqlookupd服務時,因為每個nsqd都會向所有的nsqlookupd上報本地資訊,是以nsqlookupd具有最終一緻性。
在 nsq/apps/nsqlookupd/main.go 可以找到執行入口檔案。
同樣,通過第三方 svc 包進行優雅的背景程序管理,svc.Run() -> svc.Init() -> svc.Start(),啟動 nsqlookupd 執行個體。
初始化配置參數(優先級:flagSet-指令行參數 > cfg-配置檔案 > opts-預設值),開啟協程,進入 nsqlookupd.Main() 主函數。
我們來看下 nsqlookupd 是如何監聽請求的,代碼實作如下:
開啟 goroutine 執行 tcpServer, httpServer,分别監聽 nsqd, nsqadmin 的用戶端請求。
TCPServer 循環監聽用戶端請求,建立長連接配接進行通信,并開啟 handler 處理每一個用戶端 conn。
httpServer 通過 http_api.Decorate 裝飾器實作對各 http 路由進行 handler 裝飾,如加 log 日志、V1 協定版本号的統一格式輸出等;
tcp 解析 V1 協定,内部協定封裝的 prot.IOLoop(conn) 進行循環處理用戶端指令,直到用戶端指令全部解析處理完畢才關閉連接配接。
通過内部協定進行 p.Exec(執行指令)、p.SendResponse(傳回結果),保證每個 nsqd 節點都能正确的進行服務注冊(register)與登出(unregister),并進行心跳檢測(ping)節點的可用性,確定用戶端取到的 nsqd 節點清單都是最新可用的。
nsqlookupd 服務同時開啟 tcp 和 http 兩個監聽服務,nsqd 會作為用戶端,連上 nsqlookupd 的 tcp 服務,并上報自己的 topic 和 channel 資訊,以及通過心跳機制判斷 nsqd 狀态;還有個 http 服務提供給 nsqadmin 擷取叢集資訊。
本文主要介紹 nsqlookupd 的實作,nsqlookupd 同樣是一個守護程序,負責管理拓撲資訊。用戶端通過查詢 nsqlookupd 來發現指定話題( topic )的生産者,并且 nsqd 節點廣播話題(topic)和通道( channel )資訊。有兩個接口: TCP 接口, nsqd 用它來廣播。 HTTP 接口,用戶端用它來發現和管理。
下一篇文章,将會繼續介紹 nsq 中其他子產品實作的細節。
本文分享自華為雲社群《高性能消息中間件 NSQ 解析-nsqlookupd 實作細節介紹》,原文作者:aoho 。
點選關注,第一時間了解華為雲新鮮技術~