本篇來回答各模組使用 goroutine 的情形。
Golang 的 goroutine 是一種輕量級的執行緒,由 Golang 的 runtime 管理排程。可以參考教學
這裡主要討論非同步處理時所用到的 goroutine。這些 goroutine 會持續佔有資源(如 stack),等待 Golang 的 channel 傳來事件時,才會被排程執行。
這在事件驅動的系統的實作上非常方便,例如 Prometheus Server 的 Service Discovery Manager 聽取標的的變化,有變化時就可以透過 channel 觸發其他模組更新。另外許多定時觸發的事件也是透過 goroutine 和 channel 實作。
discover.Manager
運行時,有兩種 goroutine
syncCh
。供 scrapeManager 使用。notifier.Manager
運行時,有兩種 goroutine
Send(\*Alert)
(由 rules.Manager
呼叫)所發送的 Alert。發送時每個對象又會產生一個單獨的 goroutine 負責發送。rules.Manager
運行時,沒有持久的 goroutine。但是每個 rules.Group
都佔一個 goroutine 負責
rules.Group
的建立和消滅都是由 rules.Manager.Update
導致,只會發生在重載 config 時。scrape.Manager
運行時,有一 goroutine 負責
syncCh
,並更新標的列表。scrape.Result
。remote.Storage
運行時,會將 localStorage 的 wal 資料全部傳到設定的 http 位址。然後 wal 的資料增加速度快,為了確保傳的速度能跟上資料增加的速度,Prometheus 會將 wal 資料分包傳送,所以有一 goroutine 負責
shard
列表。tsdb
運行時,有不同 goroutine 負責
web.Handler
運行時,並不會產生 goroutine。但是每個 request 會產生一 goroutine 負責處理。