K8s-client-go:WorkQueue工作队列
K8s-client-go:WorkQueue工作队列
WorkQueue队列与普通的FIFO队列,添加了标记和去重功能。有如下特性:
- 有序:按照顺序处理元素
- 去重:相同元素同一时间不会被重复处理
- 并发性:多生产者和消费者
- 标记机制:
ShutDown方法通过信号量通知队列不再接收新的元素,并通知metric goroutine退出 - 延迟:支持延迟队列,延迟一段时间将元素存入队列
- 限速:支持限速队列,元素存入队列时进行速率限制。限制一个元素出现排队(REenqueued)的次数
Metric:支持metric监控指标,可用Prometheus监控
WorkQueue支持三种队列,并且提供三种接口:
Interface:FIFO队列,支持去重Delaying Interface:延迟队列接口,基于Interface接口限制RateLimtingInterface:限速接口队列
FIFO基本队列
位置:k8s.io/client-go/util/workqueue
1 | type Interface interface { |
1 | // Type is a work queue (see the package comment). |
延迟队列
位置:k8s.io/client-go/util/workqueue/delaying_queue.go
1 | // DelayingInterface is an Interface that can Add an item at a later time. This makes it easier to |
限速队列
位置:k8s.io/client-go/util/workqueue/default_rate_limiters.go
1 | // client-go/util/workqueue/default_rate_limiters.go |
主要提供了四种限速策略:
- 令牌桶算法(BucketRateLimiter)
- 排队指数算法(ItemExponential FailureRateLimter)
- 计数器算法(ItemFastSlowRateLimter)
- 混合模式(MaxOfRateLimter)多种限速算法混合使用
令牌桶算法
主要通过go的golang.org/x/time/rate实现。
往令牌桶中固定速率添加token,多余的token会溢出。每次从token从桶中取出。
1 | &BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)}, |
排队指数算法
指数排队算法,把相同的元素的排队数作为指数,排队数增大,速度限制呈指数级增长。但是最大不会超过maxDelay。元素排队的统计是有限制周期的,一个限速周期是指数从执行AddRateLimter方法到执行完Forget方法之间的速度。如果该元素被Forget方法处理完,则清空排队数。
位置:k8s.io/client-go/util/workqueue/default_rate_limiters.go
1 | exp := r.failures[item] |
计数器算法
计数器算法就是限制一段时间内允许通过的元素数量。但是WorkQueue添加了fast和slow速率
1 | func (r *ItemFastSlowRateLimiter) When(item interface{}) time.Duration { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Joohwan!
评论


