个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈
缓存和发布订阅都是后端开发中常用的手段,其中缓存主要是用于可丢失数据的暂存,发布订阅主要是用于消息传递,今天给大家介绍一个k8s中带有发布订阅的缓存实现,其目标是给定一个时间,只关注该时间后续的事件,主要是用于近实时状态数据的获取
在k8s中的kubelet中支持不同的容器运行时,为了缓存容器运行时当前所有可见的Pod/Container就构造了一个Cache结构,当一个事件发生后,kubelet接收到事件后,此时需要获取当前Pod的状态,此时要获取的状态,就必须要求是在事件产生后的最新的状态,而不能是之前的状态,
状态数据主要是存储一个pod的状态数据
type data struct {
// 存储Pod的状态
status *PodStatus
// 试图检测Pod状态出错信息
err error
// 上次数据的修改时间
modified time.Time
}
订阅记录其实指的是一个订阅需求,其通过一个chan来进行数据通知,其中time字段是过滤条件,即只有时间大于time的记录才允许被加入到chan中
type subRecord struct {
time time.Time
ch chan *data
}
cache里面的数据在kubelet每次进行PLEG更新的时候,都会更新timestamp,并且会重新获取最新的Pod状态进行填充cache,所以这里会更新timestamp,寓意着让之前旧的状态都过期,并且会针对旧的订阅的进行数据的返回
// cache implements Cache.
type cache struct {
// 读写锁
lock sync.RWMutex
// 存储Pod的状态数据,用于满足不带时间戳的状态获取
pods map[types.UID]*data
// 全局时间戳,即当前缓存中的数据,至少都要比该时间戳新
timestamp *time.Time
//存储对应Pod的定语记录列表
subscribers map[types.UID][]*subRecord
}
普通状态获取即直接通过Map来进行数据的返回
func (c *cache) Get(id types.UID) (*PodStatus, error) {
c.lock.RLock()
defer c.lock.RUnlock()
d := c.get(id)
return d.status, d.err
}
当发现当前的cahce中并不存在对应的数据,则是直接根据ID来生成一个默认的状态数据
func (c *cache) get(id types.UID) *data {
d, ok := c.pods[id]
if !ok {
return makeDefaultData(id)
}
return d
}
// 默认状态构造器
func makeDefaultData(id types.UID) *data {
return &data{status: &PodStatus{ID: id}, err: nil}
}
会给定一个时间戳,只有当当前缓存的数据的时间在该时间戳之后,才有效,否则返回nil,这里有个关键点就是timestamp的相关设计,因为在每个PLEG周期中,都会更新timestamp
如果minTime
### 2.2.8 全局时间戳更新
全局时间戳更新,则会遍历所有的订阅,以最新的全局时间戳作为时间,进行通知
```go
func (c *cache) UpdateTime(timestamp time.Time) {
c.lock.Lock()
defer c.lock.Unlock()
c.timestamp = ×tamp
// Notify all the subscribers if the condition is met.
for id := range c.subscribers {
c.notify(id, *c.timestamp)
}
}
更新的时候,则会调用notify来进行通知
func (c *cache) Set(id types.UID, status *PodStatus, err error, timestamp time.Time) {
c.lock.Lock()
defer c.lock.Unlock()
// 进行事件的通知
defer c.notify(id, timestamp)
// 保存最新的状态数据
c.pods[id] = &data{status: status, err: err, modified: timestamp}
附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读/书籍书单大全:
(点击右侧 即可打开个人博客内有干货):技术干货小栈
=====>>①【Java大牛带你入门到进阶之路】<<====
=====>>②【算法数据结构+acm大牛带你入门到进阶之路】<<===
=====>>③【数据库大牛带你入门到进阶之路】<<=====
=====>>④【Web前端大牛带你入门到进阶之路】<<====
=====>>⑤【机器学习和python大牛带你入门到进阶之路】<<====
=====>>⑥【架构师大牛带你入门到进阶之路】<<=====
=====>>⑦【C++大牛带你入门到进阶之路】<<====
=====>>⑧【ios大牛带你入门到进阶之路】<<====
=====>>⑨【Web安全大牛带你入门到进阶之路】<<=====
=====>>⑩【Linux和操作系统大牛带你入门到进阶之路】<<=====天下没有不劳而获的果实,望各位年轻的朋友,想学技术的朋友,在决心扎入技术道路的路上披荆斩棘,把书弄懂了,再去敲代码,把原理弄懂了,再去实践,将会带给你的人生,你的工作,你的未来一个美梦。