如何分析Controller Manager 中的SharedInformer结构,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
绝大多数Controller的实现都依赖一种特殊结构-SharedInformer,它主要负责订阅etcd上资源的变更并调用注册的Handlers。
SharedInformer相关的类结构如下图:
SharedInformer是一个复杂的嵌套结构,自底向上总共包含四层
Queue
DeltaFIFO结构实现了Queue(以及Store)接口,在内部使用一个叫做items的map来存储Delta数据。items的key是通过一个预先传入的keyFunc对每个入队的object计算出来的。
基于map的存储结构能够使得DeltaFIFO快速检索到任意一个内部元素(这也是为了实现Store接口),同时queue存储了元素的进入顺序。
Reflector
Reflector结构能够通过listWatcher监控etcd上的变更,实时同步到本地的store结构中。
Controller
Controller初始化了一个DeltaFIFO结构,并将它作为store创建了一个Reflector结构,用来监控特定的etcd资源的变更。listWatcher观察到的变更会被存储到DeltaFIFO中,同时Controller会不断消费DeltaFIFO中的元素,将它作为入参call构造时传入的Process Func。
sharedIndexInformer
sharedIndexInformer实现了SharedInformer接口,它用自己的HandleDeltas()方法作为Process Func来构造Controller。Controller检测到的所有资源变更都会回调sharedIndexInformer.HandleDeltas()。
indexer是一种cache结构,它存储了监控资源的最新数据。当Controller接收到变更的时候,可以通过indexer来获取变更数据在变更前的值。
sharedProcessor用来存储所有注册的Listener。当HandleDeltas被回调时,会触发sharedProcessor上的distribute()方法,来最终调用所有注册的Listeners。
通过以上四种数据结构的配合使用,最终实现了从资源监控到Listener回调的整个数据链路。
关于如何分析Controller Manager 中的SharedInformer结构问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注天达云行业资讯频道了解更多相关知识。