searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

K8S WorkQueue 设计与实现(二)

2023-10-17 01:27:56
7
0

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

0条评论
0 / 1000
LinHeng
3文章数
0粉丝数
LinHeng
3 文章 | 0 粉丝
LinHeng
3文章数
0粉丝数
LinHeng
3 文章 | 0 粉丝
原创

K8S WorkQueue 设计与实现(二)

2023-10-17 01:27:56
7
0

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

文章来自个人专栏
K8S 设计与实现
3 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0