client-go源码分析(2.2):DeltaFIFO

前言

本文聚焦client-go v11.0.0 controller框架DeltaFIFO对象,分析源码理解DeltaFIFO的实现。DeltaFIFO是client-go controller framework的重要环节,它的作用是保证Reflector和Indexer之间对象同步。可以说,DeltaFIFO是连接生产者(Reflector)和消费者(Indexer)的通道。阅读本文前希望读者已阅读《client-go源码分析》前面的系列文章,要求已了解Informer和Reflector。

1 DeltaFIFO介绍

DeltaFIFO构造函数

以简单的示意图描述DeltaFIFO的结构:

DeltaFIFO核心结构示意图

DeltaFIFO的核心结构包括items和queue,对应Delta和FIFO。

1.1 Delta

Delta顾名思义是变化和差异,因此items的作用是缓存某个对象的一系列变更行为(Deltas)。正因为这里保存的是Delta(当前对象和前一个对象的差异),有序地保存一系列行为才有意义,单独的某个Updated状态无法正确同步对象。

items是map结构,key是由keyfunc计算出来的对象key;value是deltas,即delta列表。delta数据结构如下:

Delta数据结构

当前版本DeltaType的值只有Added, Updated, Deleted, Sync;Object即runtime.Object。

1.2 FIFO

FIFO即先进先出队列,这里queue仅把对象键(objkey)入列。消费者通过objkey查找items的Deltas并依次同步所有行为。queue是对象同步处理队列,消费者仅处理queue中存在的objkey。

2 DeltaFIFO基本功能

上述已经提到DeltaType只有四种:Added, Updated, Deleted, Sync。这里仅分析最难理解的Sync函数,Sync是List机制和Resync触发的全量同步;Added,Updated,Deleted是Watch触发的增量同步。

2.1 深入理解Sync:Replace()

Sync是比较特殊的处理,理解了Sync也就不难理解其他行为。Sync是指Reflector全量同步Indexer,从DelaFIFO的实现看是调用Replace函数“重建”Indexer。DelaFIFO的Replace实现了Sync行为(Resync也调用该函数)。controller第一次启动时,Reflector的List机制触发DeltaFIFO的Sync行为,《Client-Go源码分析(2.1):Reflector》会提到r.syncWith(items,

resourceVersion)函数,该函数调用

func (f *DeltaFIFO) Replace(list []interface{},

resourceVersion string) error

开始分析Replace代码前,先看一个重要的公共函数queueActionLocked,DeltaFIFO的所有行为都会调用它。queueActionLocked的功能是:仅处理某个动作。若处理一系列动作或多个对象,需要外部调用者重复调用它。

queueActionLocked注释
Replace注释1
Replace注释2
Replace注释3

2.2 queueActionLocked的特殊处理分析

上文提到的queueActionLocked特殊处理针对一种场景:

obj的id是objkey1,该对象最后一次动作是Deleted,并且objkey1仍在queue中等待处理。此时周期性被动触发一次Resync(会调用Replace)。k8s集群真实的runtime.Object已删除,但Indexer的同步尚未完成,Indexer缓存里仍有这个对象。

sync场景分析

假设queueActionLocked更新了deltas如上图(左)所示,该对象会先删除,然后添加回来!从Pop()函数里的回调函数Process可以看到这个过程。前几篇文章已经提到过,Process的入参obj是Deltas队列,该函数依次处理每个Delta行为。当Process处理到上图(左)Deleted时Index会删除对象;当它处理到最后的Sync时,Index又会添加这个对象。因此,queueActionLocked通过特殊处理规避了这个问题,现有代码的处理方式如上图(右)所示,直接返回不更新deltas。

Process的实现

2.3 sync场景的DeleteFinalStateUnknown分析

// DeletedFinalStateUnknown isplaced into a DeltaFIFO in the case where

// an object was deleted but thewatch deletion event was missed. In this

// case we don't know the final"resting" state of the object, so there's

// a chance the included `Obj` isstale.

这个对象困惑了我许久,从注释上看是针对Watch Deleted事件丢失,导致k8s实际对象和Indexer缓存不一致的场景。我们用图展示两种场景:1. Deleted事件未丢失,只是queue待处理该对象;2. Deleted事件丢失。

Deleted消息是否丢失场景比较

上图(左)是Deleted消息丢失的代码处理,queueActionLocked会添加DeleteFinalStateUnknown对象到deltas,并保存到Indexer。DeleteFinalStateUnknown是对runtime.Object的封装。

上图(右)是Deleted消息未丢失的代码处理。deltas对象变化过程如下:

deltas对象变化过程

从Process回调函数看,是直接调用clientState.Delete(d.Object)删除对象的,Indexer计算对象键是否会异常呢?抱着好奇心看了一眼keyFunc(计算对象键的函数,下一篇文章会讲到)DeletionHandlingMetaNamespaceKeyFunc:

DeletionHandlingMetaNamespaceKeyFunc的实现

DeletionHandlingMetaNamespaceKeyFunc果然有对DeletedFinalStateUnknown的处理(obj.(DeletedFinalStateUnknown)是类型断言用法),因此不需要担心获取对象键会异常。如果是我们自己实现keyFunc,一样要考虑到DeletedFinalStateUnknown这个而特殊对象。

到此为止DeltaFIFO的主要机制已分析完毕。

3 结语

DeltaFIFO的部分代码比较晦涩,尤其是特殊处理增加了阅读难度。特殊处理一时爽,代码维护两行泪。

4 参考文档

https://blog.csdn.net/li_101357/article/details/89763992

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容