kubernetes fifo 源码解析
kubernetes fifo 源码解析
1.介绍
kubernetes fifo 是一个先入先出队列,实现了 Add、Update、Delete、Get、Pop 等基本 API,以及 Replace、HasSynced 等 API,具体如下:
func NewFIFO(keyFunc KeyFunc) *FIFO
创建一个先入先出队列
func (f *FIFO) Add(obj interface{}) error
添加一个 obj,当 f.queue 中已存在对应的 key 时,f.queue 不再添加
func (f *FIFO) AddIfNotPresent(obj interface{}) error
当 f.items 不存在 obj 对应的 key 时才添加,这在单一生产者/消费者有用,消费者可以安全的重试,避免与生产者竞争以及重入队已消费的 item
func (f *FIFO) Close()
关闭队列
func (f *FIFO) Delete(obj interface{}) error
删除不存在 f.queue 中的 item,因为这个实现假设使用者只关心对象,而不关心创建/添加对象的顺序
func (f *FIFO) Get(obj interface{}) (item interface{}, exists bool, err error)
返回请求的 item,不存在时 exists 为 false
func (f *FIFO) GetByKey(key string) (item interface{}, exists bool, err error)
返回请求的 item,不存在时 exists 为 false
func (f *FIFO) HasSynced() bool
当 Add/Update/Delete/AddIfNotPresent 先被调用,或者先被 Replace()插入的 items 都被 Pop 时,HasSynced 返回 true
func (f *FIFO) IsClosed() bool
检车队列是否关闭
func (f *FIFO) List() []interface{}
返回所有 items.
func (f *FIFO) ListKeys() []string
返回当前 FIFO 中所有的 key
func (f *FIFO) Pop(process PopProcessFunc) (interface{}, error)
Pop 会等到 f.queue 中有对象,并且会调用 PopProcessFunc 处理 item。如果 f.queue 中有多个待处理的对象,则将按照 Add/Update 的顺序返回。在调用 PopProcessFunc 之前,会从队列(和存储)中删除 item。如果 PopProcessFunc 返回 ErrRequeue,会使用 AddIfNotPresent()将其添加回来,因此保证可重复消费。PopProcessFunc 是在锁定状态下调用的,因此在 PopProcessFunc 中操作 FIFO 的数据结构是安全的。
func (f *FIFO) Replace(list []interface{}, resourceVersion string) error
会根据 list 重新生成一个 map,并将 f.items 指向新的 map,依据该 map 重新入队 f.queue,所以 f.queue 是无序的
func (f *FIFO) Resync() error
Resync 会保证 f.items 中的 key 全部存在 f.queue 中,一般不应该调用该方法,因为其他 api 应当维持关联关系
func (f *FIFO) Update(obj interface{}) error
与 Add 实现一致
2.使用
3.源码解析
4.总结
kubernetes fifo 在实现先入先出队列上,值得我们学习借鉴
版权声明: 本文为 InfoQ 作者【欢乐的阿苏】的原创文章。
原文链接:【http://xie.infoq.cn/article/7dc460e1cbc626b76d43cdfb0】。文章转载请联系作者。
评论