「连载」边缘计算(二十二)02-27:边缘部分源码(源码分析篇)

(接上篇)

devicetwin 的具体逻辑剖析

devicetwin的启动函数具体如下所示。

|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| KubeEdge/edge/pkg/devicetwin/devicetwin.go |
| //Start run the module func (dt *DeviceTwin) Start(c *context.Context) { controller, err := InitDTController(c) if err != nil { klog.Errorf("Start device twin failed, due to %v", err) } dt.dtcontroller = controller dt.context = c err = controller.Start() if err != nil { klog.Errorf("Start device twin failed, due to %v", err) } } |

启动函数主要做了如下两件事情。

  1. 初始化DTController(controller, err := InitDTController(c));

  2. 启动已经初始化的DTController(err = controller.Start())。

初始化DTController时把传入的beehive context消息框架实例,并在其中初始化一些devicetwin所需的channel,以便与传入的beehive context消息框架实例进行交互。

下面深入剖析已经初始化的DTController在启动过程中和启动以后所做的事。DTController启动函数Start()的定义具体如下所示。

|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| KubeEdge/edge/pkg/devicetwin/dtcontroller.go |
| //Start devicetwin controller func (dtc *DTController) Start() error { err := SyncSqlite(dtc.DTContexts) ... moduleNames := []string{dtcommon.MemModule, dtcommon.TwinModule, dtcommon.DeviceModule, dtcommon.CommModule} for _, v := range moduleNames { dtc.RegisterDTModule(v) go dtc.DTModules[v].Start() } ... } } |

DTController启动函数Start()主要做了两件事。

1) 将数据库中的内容加载到内存中(err := SyncSqlite(dtc.DTContexts));

2) 启动devicetwin中所有的module,具体如下所示。

|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| moduleNames := []string{dtcommon.MemModule, dtcommon.TwinModule, dtcommon.DeviceModule, dtcommon.CommModule} for _, v := range moduleNames { dtc.RegisterDTModule(v) go dtc.DTModules[v].Start() } |

devicetwin 的缓存机制剖析

devicetwin中的缓存是利用Golang本身的sync.Map实现的,这里不展开剖析。推测KubeEdge在edge端的offline mode也是基于Golang本身的sync.Map实现的,这样会带来以下问题。

1)基于Golang的sync.Map需要处处用锁,在并发量大的情况下会出现堵塞。

2)基于Golang的sync.Map内存最大限度是多少,缓存周期怎么控制,缓存与持久存储怎么平衡。

到此,EdgeCore组件的devicetwin功能模块源码分析就结束了。

未完待续......

相关推荐
音视频牛哥1 分钟前
如何在Python下实现摄像头|屏幕|AI视觉算法数据的RTMP直播推送
人工智能·opencv·计算机视觉
SecPulse10 分钟前
AI开源竞赛与硬件革命:2025年3月科技热点全景解读——阿里、腾讯领跑开源,英特尔、台积电重塑算力格局
人工智能·科技·opencv·自然语言处理·开源·语音识别
云端源想13 分钟前
浅谈大语言模型(LLM)的微调与部署
人工智能·语言模型·自然语言处理
瑶光守护者1 小时前
并行计算编程模型的发展方向与RISC-V的机遇
人工智能·笔记·学习·架构·risc-v
初心丨哈士奇2 小时前
基于大模型的GitLab CodeReview 技术调研
前端·人工智能·node.js
Luis Li 的猫猫2 小时前
基于MATLAB的冰块变化仿真
开发语言·图像处理·人工智能·算法·matlab
xiatian_win1232 小时前
本地部署 OpenManus 保姆级教程(Windows 版)
人工智能·windows
蹦蹦跳跳真可爱5892 小时前
Python----计算机视觉处理(opencv:像素,RGB颜色,图像的存储,opencv安装,代码展示)
人工智能·python·opencv·计算机视觉
BIT_Legend3 小时前
Torch 模型 model => .onnx => .trt 及利用 TensorTR 在 C++ 下的模型部署教程
c++·人工智能·python·深度学习
蹦蹦跳跳真可爱5893 小时前
Python----计算机视觉处理(Opencv:自适应二值化,取均值,加权求和(高斯定理))
人工智能·python·opencv·计算机视觉