专栏首页有点技术kubeedge - 消息同步框架beehive介绍

kubeedge - 消息同步框架beehive介绍

Beehive

在看kubeedge的源码过程中发现对beehive的理解不够深刻,所以又回来看了一下beehive的官方文档

概述

Beehive是基于go-channel的消息传递框架,用于KubeEdge模块之间的通信。如果已注册其他beehive模块的名称或该模块组的名称已知,则在蜂箱中注册的模块可以与其他蜂箱模块进行通信。Beehive支持以下模块操作:

  • 添加模块
  • 将模块添加到组
  • 清理(从蜂巢核心和所有组中删除模块)

Beehive支持以下消息操作:

  • 发送到模块/组
  • 通过模块接收
  • 发送同步到模块/组
  • 发送对同步消息的响应

消息格式

消息分为三部分

1.header:

  • ID:消息ID(字符串)
  • ParentID:如果是对同步消息的响应,则说明parentID存在(字符串)
  • TimeStamp:生成消息的时间(整数)
  • sync:标志,指示消息是否为同步类型(布尔型)

2.Route:

  • Source:消息的来源(字符串)
  • Group:必须将消息广播到的组(字符串)
  • Operation:对资源的操作(字符串)
  • Resource:要操作的资源(字符串)

3.content:消息的内容(interface{})

注册模块

  1. 在启动edgecore时,每个模块都会尝试将其自身注册到beehive内核。
  2. Beehive核心维护一个名为modules的映射,该映射以模块名称为键,模块接口的实现为值。
  3. 当模块尝试向蜂巢核心注册自己时,beehive 内核会从已加载的modules.yaml配置文件中进行检查, 以检查该模块是否已启用。如果启用,则将其添加到模块映射中,否则将其添加到禁用的模块映射中。

channel上下文结构字段

  • channels - channels是字符串(键)的映射,它是模块的名称和消息的通道(值),用于将消息发送到相应的模块。
  • chsLock - channels map的锁
  • typeChannels - typeChannels是一个字符串(key)的映射,它是组(将字符串(key)映射到message的chan(value), 是该组中每个模块的名称到对应通道的映射。
  • typeChsLock - typeChannels map的锁
  • anonChannels - anonChannels是消息的字符串(父id)到chan(值)的映射,将用于发送同步消息的响应。
  • anonChsLock - anonChannels map的锁

模块操作

添加模块

  • 添加模块操作首先创建一个消息类型的新通道。
  • 然后,将模块名称(键)及其通道(值)添加到通道上下文结构的通道映射中。
  • 例如:添加边缘模块
coreContext.Addmodule(“edged”)

将模块添加到组中

  • 首先,addModuleGroup从通道映射中获取模块的通道。
  • 然后,将模块及其通道添加到typeChannels映射中,其中key是组,值是map中的映射(key是模块名称,value是通道)。
  • 例如:在边缘组中添加边缘。这里的第一个边缘是模块名称,第二个边缘是组名称。
coreContext.AddModuleGroup(“edged”,”edged”)

CleanUp

  • CleanUp从通道映射中删除该模块,并从所有组(typeChannels映射)中删除该模块。
  • 然后,关闭与模块关联的通道。
  • 例如:清理边缘模块
coreContext.CleanUp(“edged”)

消息操作

发送给模块

  • 发送从通道映射中获取模块的通道。
  • 然后,将消息放入通道。
  • 例如:发送消息到edged。
coreContext.Send(“edged”,message) 

发送给一组

  • SendToGroup从typeChannels映射获取所有模块(映射)。
  • 然后,在地图上进行迭代,并在地图中所有模块的通道上发送消息。
  • 例如:要发送到边缘组中所有模块的消息。
coreContext.SendToGroup(“edged”,message) message will be sent to all modules in edged group.

通过模块接收

  • 接收从通道图获取模块的通道。
  • 然后,它等待消息到达该通道并返回消息。如果有错误,则返回错误。
  • 例如:接收边缘模块的消息
msg, err := coreContext.Receive("edged")

SendSync到模块

  • SendSync具有3个参数(模块,消息和超时持续时间)
  • SendSync首先从channels map中获取模块的channel。
  • 然后,将消息放入channel。
  • 然后创建一个新的消息channel,并将其添加到anonChannels映射中,其中键是messageID。
  • 然后,它等待在它创建的anonChannel上接收到消息(响应),直到超时。
  • 如果在超时之前收到消息,则返回错误为nil的消息,否则返回超时错误。
  • 例如:以60秒的超时时间将同步发送到边缘
response, err := coreContext.SendSync("edged",message,60*time.Second)

SendSync到组

  • 从typeChannels映射中获取组的模块列表。
  • 创建一个消息channel,其大小等于该组中的模块数,然后将anonChannels映射作为值放入,键为messageID。
  • 在所有模块的channel上发送消息。
  • 等到超时。如果anonChannel的长度=该组中的模块数,请检查通道中的所有消息是否具有parentID = messageID。如果没有返回错误,则返回nil错误。
  • 如果达到超时,则返回超时错误。
  • 例如:以60秒的超时时间向edged发送同步消息
err := coreContext.SendToGroupSync("edged",message,60*time.Second)

SendResp到同步消息

  • SendResp用于发送同步消息的响应。
  • 发送响应的messageID必须在响应消息的parentID中。
  • 调用SendResp时,它将检查响应消息的parentID是否存在anonChannels。
  • 如果channel存在,则在该channel上发送消息(response)。
  • 否则将记录错误。
coreContext.SendResp(respMessage)

本文分享自微信公众号 - 有点技术(havetech),作者:rocdu

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-11-19

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 控制pod内container执行顺序的几种姿势

    在使用k8s的过程中在特定场景可能需要控制pod的执行顺序,接下来我们将学习各个开源组件的实现方式

    有点技术
  • keycloak+istio实现基于jwt的服务认证授权

    基于角色的访问控制(RBAC)为服务提供服务级别和方法级别的访问控制。RBAC政策是附加的。依次检查策略。根据操作以及是否找到匹配的策略,允许或拒绝请求。

    有点技术
  • jaeger入门

    有两个服务组成,svc1,svc2 有三个span组成,svc1 sayhello --> svc1 req svc2 --> svc2 get bagger

    有点技术
  • ABP框架 - 模块系统

    我思故我在
  • 详解AMD规范

    AMD全称是Asynchronous Modules Definition异步模块定义,提供定义模块及异步加载该模块依赖的机制,这和浏览器的异步加载模块的环境刚...

    无邪Z
  • python模块编程

    模块是一个包含所有你定义的函数和变量的文件,其后缀名是.py。模块可以被别的程序引入,以使用该模块中的函数等功能。这也是使用 python 标准库的方法。

    老雷PHP全栈开发
  • 有赞移动 iOS 组件化(模块化)架构设计实践

    业务组件化(或者叫模块化)作为移动端应用架构的主流方式之一,近年来一直是业界积极探索和实践的方向。有赞移动团队自 16 年起也在不断尝试各种组件化方案,在有赞微...

    有赞coder
  • Spring@Enable模块装配

    首先要说一下版本相关,Spring Framework3.1开始引入了@Enable注解。

    用户4143945
  • 关于光模块,看这一篇就够啦!

    随着光通信的高速发展,现在我们工作和生活中很多场景都已经实现了“光进铜退”。也就是说,以同轴电缆、网线为代表的金属介质通信,逐渐被光纤介质所取代。

    鲜枣课堂
  • PHP-TP创建模块

    一个典型的应用是由多个模块组成的(通常有前台网站模块和后台管理系统模块),这些模块通常都是应用目录下面的一个子目录,每个模块都有自己独立的配置文件、公共文件和类...

    cwl_java

扫码关注云+社区

领取腾讯云代金券