informer和sharedInformer的处理流程比较

本文详细比较了Kubernetes中informer与SharedInformer的工作流程,重点解析两者在事件处理上的不同:informer直接处理事件,而SharedInformer则先缓存再处理。通过代码示例展示了如何使用SharedInformer监听节点变化。

我们已经介绍过informer和SharedInformer。那么他们相关的处理流程上有什么不同,下面我们通过流程图来介绍:

informer的处理流程

informer的处理流程,我们以client-go的example/workqueue/main.go的代码为例:

SharedInformer的处理流程

SharedInformer的处理流程,这里自己写了一份代码:

package client_example

import (
        "flag"
        "fmt"
        "log"
        "path/filepath"

        corev1 "k8s.io/api/core/v1"
        "k8s.io/apimachinery/pkg/labels"
        "k8s.io/apimachinery/pkg/util/runtime"

        "k8s.io/client-go/informers"
        "k8s.io/client-go/kubernetes"
        "k8s.io/client-go/tools/cache"
        "k8s.io/client-go/tools/clientcmd"
        "k8s.io/client-go/util/homedir"
)

func main() {
        var kubeconfig *string
        if home := homedir.HomeDir(); home != "" {
                kubeconfig = flag.String("kubeconfig", filepath.Join(home, ".kube", "config"), "(optional) absolute path to the kubeconfig file")
        } else {
                kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file")
        }
        flag.Parse()

        config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig)
        if err != nil {
                panic(err)
        }

        // 初始化 client
        clientset, err := kubernetes.NewForConfig(config)
        if err != nil {
                log.Panic(err.Error())
        }

        stopper := make(chan struct{})
        defer close(stopper)

        // 初始化 informer
        factory := informers.NewSharedInformerFactory(clientset, 0)    //工厂实例
        nodeInformer := factory.Core().V1().Nodes()             // 工厂类型
        informer := nodeInformer.Informer()     // 工厂方法生成informer
        defer runtime.HandleCrash()

        // 启动 informer,list & watch
        go factory.Start(stopper)

        // 从 apiserver 同步资源,即 list
        if !cache.WaitForCacheSync(stopper, informer.HasSynced) {
                runtime.HandleError(fmt.Errorf("Timed out waiting for caches to sync"))
                return
        }

        // 使用自定义 handler
        informer.AddEventHandler(cache.ResourceEventHandlerFuncs{
                AddFunc:    onAdd,
                UpdateFunc: func(interface{}, interface{}) { fmt.Println("update not implemented") }, // 此处省略 workqueue 的使用
                DeleteFunc: func(interface{}) { fmt.Println("delete not implemented") },
        })

        // 创建 lister
        nodeLister := nodeInformer.Lister()
        // 从 lister 中获取所有 items
        nodeList, err := nodeLister.List(labels.Everything())
        if err != nil {
                fmt.Println(err)
        }
        fmt.Println("nodelist:", nodeList)
        <-stopper
}

func onAdd(obj interface{}) {
        node := obj.(*corev1.Node)
        fmt.Println("add a node:", node.Name)
}

总结

从上面两者的流程图,我们可以看到最大的区别是,在事件触发回调函数时是否直接调用回调函数处理事件。informer是直接处理,SharedInformer是对事件进行接收、缓存,转发之后在进行处理。

### 结合InformerLSTM的时间序列预测 #### 背景介绍 时间序列预测是一个重要的研究领域,在金融、气象等领域有着广泛的应用。随着深度学习的发展,多种神经网络架构被应用于这一任务中。其中,长短时记忆网络(Long Short-Term Memory, LSTM)因其能有效捕捉长期依赖特性而受到青睐;然而面对超长序列的数据集时,其性能可能会受到影响[^1]。 为了应对上述挑战,研究人员提出了基于自注意力机制的Informer模型,该模型不仅解决了传统Transformer存在的内存消耗大等问题,还进一步提升了对于极长序列数据处理的能力[^2]。因此,将两者结合起来构建混合框架成为了一种新的探索方向。 #### 架构设计思路 一种可行的方法是在保持各自优势的基础上实现两者的融合: - **编码阶段**:利用Informer作为主要组件来提取全局上下文信息以及局部模式特征; - **解码阶段**:引入带有门控单元结构的标准LSTM层负责生成最终输出结果。这样做可以在保留前者高效捕获远距离关联的同时借助后者更好地模拟短期动态变化规律[^3]。 具体来说,整个流程如下所示: 1. 输入原始时间序列经过预处理后送入到由多个堆叠起来的Encoder Layers组成的模块里成初步表征转换工作。 2. 接着这些中间表示会被传递给Decoder部分,在这里先执行一次Self Attention操作以获取当前时刻的状态向量。 3. 随后此状态会与来自上一环节产生的Key/Value对一起参与Cross Attention过程得到更精细粒度的信息表达形式。 4. 最终再通过一层或多层全连接型LSTM Cell来进行最后几步迭代更新直至获得整的未来趋势估计值。 ```python import torch.nn as nn class Informer_LSTM(nn.Module): def __init__(self, input_dim=784, hidden_dim=500, output_dim=10, num_layers=2): super(Informer_LSTM, self).__init__() # Define the informer part of model here... self.informer = ... # Define an LSTM layer that will be used after informer processing. self.lstm = nn.LSTM(input_size=input_dim, hidden_size=hidden_dim, num_layers=num_layers, batch_first=True) self.fc_out = nn.Linear(hidden_dim, output_dim) def forward(self, x): # Pass through informer layers first to get encoded features. encoder_output = self.informer(x) lstm_input = encoder_output.unsqueeze(dim=-1).transpose(1, 2) # Adjust dimensions for LSTM out_lstm, _ = self.lstm(lstm_input) prediction = self.fc_out(out_lstm[:, -1, :]) # Use last time step's output from LSTM return prediction ``` 这种方法充分利用了两个不同类型的深层网络各自的优点——一方面依靠Informer强大的建模能力快速定位重要时间节点及其相互间的关系;另一方面则凭借LSTM良好的泛化性解释力确保所得结论具有较高的可信度实用性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值