DeltaFIFO
DeltaFIFO原理
Reflector获取到我们的资源列表或者是监听到我们的资源事件变化的时候,他是如何将我们的数据放入到Delta FIFO Queue
这个对列里面的,Delta FIFO
其实是client-go给我们提供的一种存储,client-go提供了以下几种存储
cache
: 它是一个内部的struct,实现Store,利用threadSafeMap存放数据UndeltaStore
: 实现了Store,利用cache存放数据,数据变更时通过PushFunc发送当前完整状态(数据变更时就会把cache里面的完整状态发送到PushFunc里面去)FIFO
: 实现Queue(含Store),利用自已内部的items数据结构存放数据DeltaFIFO
:Heap
: 实现Store,利用data数据结构存放数据,实现堆数据结构,用于优先级队列的场景ExpirationCache
: 实现Store,利用threadSafeMap存放数据
DeltaFIFO的应用场景
- 希望处理每个对象的变化最多一次时
- 处理一个对象时,希望知道这个对象与上次处理时,发生了哪些变化
- 希望一个对象删除时,我们仍然能处理它
- 能够周期性的重新处理所有的对象(实际就是Resync方法实现的逻辑)
DeltaFIFO定义
type DeltaFIFO struct {
//...
//存放Delta
//与queue中存放的key是同样的key
//items里面的key其实也是KeyFunc计算出来的key
items map[string] Deltas
//可以确保顺序性
queue []string
//默认使用MetaNamespaceKeyFunc,默认使用<namespace>/<name>的格式,不指定namespace时用name
//那么我们从队列中key里面也可以获取到重要的信息了
keyFunc KeyFunc
//其实就是Indexer,专门存放全量数据的地方
knownObjects KeyListerGetter
//...
}
事件的生产和消费
生产
Reflector
的List
Reflector
的Watch
Relfector
的Resync
消费
- 事件派发到work queue
- 刷新本地缓存