「连载」边缘计算(二十二)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.DTModulesv.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.DTModulesv.Start() } |

devicetwin 的缓存机制剖析

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

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

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

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

未完待续......

相关推荐
德昂信息dataondemand14 分钟前
如何评估BI项目的价值与效益
大数据·人工智能
星马梦缘17 分钟前
机器学习与模式识别 第八章 MAP与偏方差 模拟卷及答案
人工智能·机器学习·map·岭回归·mle·双重下降
liangshanbo121518 分钟前
大模型混合精度训练:原理、选型与实战笔记
人工智能·深度学习
技术小黑21 分钟前
CNN算法实战系列08 | ResNeXt-50算法实战与猴痘病识别
人工智能·算法·cnn
四川国阜传动设备有限公司24 分钟前
如何根据电机功率正确计算减速机输出扭矩?
人工智能·搜索引擎
格子软件27 分钟前
2026年GEO优化系统源码级状态机与多模型调度拆解
java·前端·vue.js·人工智能·vue·geo
数据百晓通31 分钟前
重构数据治理范式:2026 主流企业级数据治理平台对标与精准选型
大数据·人工智能·重构
CTA终结者42 分钟前
2026年AI量化提效,工具重点要按阶段调整
人工智能·python
zhangfeng11331 小时前
算子开发 Overwrite 覆盖/替换模式 Accumulate 累加模式,性能对比 memset错误 bat_alloc 错误
c语言·人工智能·gnu·算子开发
zzz_23681 小时前
从 200 行规则到一条好渠——Agent 工程化的踩坑与解法
人工智能·agent