「连载」边缘计算(二十二)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功能模块源码分析就结束了。

未完待续......

相关推荐
企鹅的企1 小时前
2027北京AI健康科技与智慧医疗展官方精准邀约进行中
人工智能·科技
高德诚1 小时前
探索桌面智能的无限可能:小小舵机,撑起 AI 仿生交互的完整未来
人工智能
2601_956319881 小时前
2026年零基础学量化:从看懂示例到写清条件和动作
人工智能·python
ArkAPI1 小时前
Claude Code 连发安全修复:AI 编程 Agent 的权限,正在成为新的“安全事故高发区”
人工智能·大模型·api·codex·ai工具·claude code·arkapi
Thecozzy1 小时前
大厂 AI Coding 面试大招
人工智能·面试·职场和发展
维核科技1 小时前
推理加速实战:投机解码与KV Cache优化让大模型“快起来“
人工智能
数智化管理手记1 小时前
海量数据如何沉淀有效数据资产?数据标准化治理方案如何搭建?
java·大数据·人工智能
过期的秋刀鱼!1 小时前
LangChain-D1-模型的工作流程
人工智能·python·langchain
科技象限1 小时前
数智落地提速:2026下半年传统行业智能化升级爆发场景预判
人工智能