這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
上一篇文章:go語言nsq源碼解讀三 nsqlookupd源碼nsqlookupd.go主要讀了nsqlookupd.go這個檔案,本節會解讀nsqlookupd.go檔案中涉及到的其中三個檔案:options.go、context.go和wait_group_wrapper.go。
options.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
package nsqlookupd
import ( "log" "os" "time" )
type nsqlookupdOptions struct { Verbose bool `flag:"verbose"` //是否開啟囉嗦模式,開啟後,會打很多LOG,一般在調試或定位問題時使用。
TCPAddress string `flag:"tcp-address"` //TCP監聽地址 HTTPAddress string `flag:"http-address"` //HTTP監聽地址 BroadcastAddress string `flag:"broadcast-address"` //這個lookup節點的對外地址
//producer的互動逾時時間,預設是5分鐘。就是說,如果5分鐘內nsqlookupd沒有收到producer的PING(類似心跳包),則會認為producer已掉線。 InactiveProducerTimeout time.Duration `flag:"inactive-producer-timeout"` //字面直譯是墓碑時間 //在nsqadmin的http介面中訪問/tombstone_topic_producer URL時,nsqlookupd會給producer TombstoneLifetime長度的時間來登出 //預設為45秒,在這45秒內,producer不會再被任何consumer通過nsqadmin的/lookup操作找到,同時producer還會進行刪除topic等操作。 //45秒之後,producer就會與nsqlookupd中斷連線,同時通過nsqlookupd TCP串連中的UNREGISTER操作在資料記錄中把該producer刪除。 TombstoneLifetime time.Duration `flag:"tombstone-lifetime"` }
// //建立nsqlookupdOptions類型的變數的指標 // func NewNSQLookupdOptions() *nsqlookupdOptions { //擷取主機名稱 hostname, err := os.Hostname() if err != nil { log.Fatal(err) }
//返回nsqlookupdOptions類型的變數,並指定預設參數。 return &nsqlookupdOptions{ //TCP監聽原生4160連接埠 TCPAddress: "0.0.0.0:4160", //HTTP監聽原生4161連接埠 HTTPAddress: "0.0.0.0:4161", //主機名稱 BroadcastAddress: hostname,
//5分鐘逾時 InactiveProducerTimeout: 300 * time.Second, //45秒 TombstoneLifetime: 45 * time.Second, } } |
context.go
1 2 3 4 5 6 7 8 9
|
package nsqlookupd
// //根據Context的命名,指環境、內容相關的意思。通俗來講,就是儲存一些運行環境的資訊 //從下面的定義可以看出,Context只是包含了NSQLookupd的指標 // type Context struct { nsqlookupd *NSQLookupd } |
wait_group_wrapper.go
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
|
package util
import ( "sync" )
// //本檔案是對WaitGroup的封裝,關於WaitGroup,根據字義,wait是等待的意思,group是組、團體的意思,合起來就是指等待一個組。 //即指,當一個組裡所有的操作都完成後,才會繼續執行。 //可以參考http://www.baiyuxiong.com/?p=913理解WaitGroup用法 //
type WaitGroupWrapper struct { sync.WaitGroup }
func (w *WaitGroupWrapper) Wrap(cb func()) { w.Add(1) go func() { cb() w.Done() }() } |