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,对延时元素按入队的时间点进行排序,最终入队时的提高效率