WorkQueue 是 Kubernetes 的一個隊列實現,屬于 client-go 庫的 workqueue 包,其作為 K8S Controller 的重要組成部份,在資源變化時將資源寫入 WorkQueue 中,再由具體的 worker 去消費執行
上文我們講解了 WorkQueue 基本隊列的設計與實現
本文描述其另外一個隊列,延時隊列 delaying queue 的實現
延時隊列
接口聲明
基本隊列的接口聲明
type DelayingInterface interface {
// 組合基礎隊列的接口
Interface
// 在指定時間后將元素加入隊列
AddAfter(item interface{}, duration time.Duration)
}
可見,延時隊列的接口什么就比基礎隊列的多了個 AddAfter 方法,延遲元素加入的時間
接口實現
讓我們看一下延時隊列的實現
type delayingType struct {
// 基本隊列,完成隊列的主要功能
Interface
// 一個緩沖隊列存放延遲的元素(元素使用 watiFor 封裝)
waitingForAddCh chan *waitFor
...
}
type waitFor struct {
// 元素本體
data t
// 可以入隊的時間點
readyAt time.Time
// 優先隊列的索引
index int
}
delayingType 對 AddAfter 的實現分為2個階段
1. 將需要延時的元素封裝為 waitFor 結構,傳入 waitingForAddCh 通道
2. 一個 goroutine 執行 waitingLoop,循環消費 waitingForAddCh 里的數據,其會通過維護一個 heap 隊列 waitingForQueue,對延時元素按入隊的時間點進行排序,最終入隊時的提高效率