(接上篇)
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) } } |
启动函数主要做了如下两件事情。
-
初始化DTController(controller, err := InitDTController(c));
-
启动已经初始化的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功能模块源码分析就结束了。
「 未完待续...... 」