6.1 拓扑图中的角色定义

在发布-订阅架构的基础上,进一步抽象出拓扑图中的角色,以清晰描述节点间的通信关系。如图所示,拓扑图中的核心角色包括Publisher(发布者)、Subscriber(订阅者)和Node(节点)。这些角色的定义如下:

Publisher(发布者):负责生成并发布数据的实体,对应于前文所述的Transmitter。一个Publisher通过指定的Channel发布数据,其身份由Identity和RoleAttributes唯一标识。

Subscriber(订阅者):负责订阅并接收数据的实体,对应于Receiver。一个Subscriber通过订阅特定的Channel获取数据,并通过回调函数处理接收到的信息。

Node(节点):通信平面中的基本管理单元,一个Node可以同时包含多个Publisher和Subscriber。在一个进程中,可创建多个Node,Node通过Transport层提供的接口创建和管理这些角色,并维护其与外部节点的连接关系。

img

6.2 拓扑图的底层数据结构设计

前文已阐明,有向图因其在表示方向性关系和支持动态调整方面的优势,被选为拓扑机制的核心模型。本节聚焦于拓扑图的组成要素——顶点(Vertice)、边(Edge)和图(Graph),以下从顶点与边的定义、图的整体结构及其关系表达三个方面,系统阐述该数据结构的设计。

顶点是拓扑图的基本构成单元,代表分布式通信平面中的独立实体。每个顶点对应于一个Node节点。

边是有向图中连接顶点的纽带。每条边由三个要素组成,如表所示:

参数名称 描述
源顶点(src) 数据流的起点,对应发送方的Node节点。
目标顶点(dst) 数据流的终点,对应接收方的Node节点。
边属性(value) 描述边的信息,对应通信中的Channel标识

图(Graph)作为顶点与边的集合,提供了拓扑关系的全局视图。图采用邻接表形式组织,其结构由以下两个主要部分构成:

  • 邻接表(Adjacency List):邻接表以每个顶点为中心,记录其所有下游顶点(即出边指向的目标顶点)。邻接表通过键值映射实现,其中键为源顶点的标识,值为目标顶点的集合。
  • 边信息集合(Edge Info):为支持双向关系查询,图中额外维护了一个边信息集合,以边属性(如Channel标识)为索引,记录与该属性相关的所有源顶点和目标顶点。

通信平面中的拓扑关系可通过图(Graph)进行描述,如图所示,通信平面中存在了四个节点:NodeA、NodeB、NodeC、NodeD,这四个节点对应图中的顶点,每个节点中分布着Publisher和Subscriber,节点与节点间通过channel互相传递数据,自然的channel标识就被设置为拓扑图的边。

img

6.3 拓扑图的动态管理

拓扑的动态管理通过节点管理器来实现(NodeManager),每个节点都会对应一个节点管理器,NodeManager会在本地维护一张拓扑图,当有新的通信角色加入或者离开拓扑图时都会广播变更消息(ChangeMsg),已在图中的节点就会根据此广播的变更消息更新本地维护的拓扑图。ChangeMsg消息结构定义如表所示。

NodeManager的数据广播操作借助FastRTPS实现。在NodeManager中,分别维护一个RtpsWriter和RtpsReader,用于发送和接收ChangeMsg。如图所示,当Publisher或Subscriber加入或退出时,其所属NodeManager通过RtpsWriter向”change_broadcast”通道发送ChangeMsg,所有节点的RtpsReader从该通道接收消息,并根据接收到的ChangeMsg更新本地拓扑图。例如,一个新Publisher加入Node A时,NodeManager广播包含其RoleAttributes的ChangeMsg,其他节点的NodeManager据此在本地图中添加相应的边。

名称 描述
Timestamp 时间戳
OperateType 角色动作,代表加入还是离开拓扑图
RoleType 角色类型,拓扑图中有三种类型:Node、Pubslisher、Subsriber
RoleAttributes 角色的通信标识,其中包含了Channel相关信息
NodeName 角色所属的Node的标识

img

6.4 拓扑机制设计

img

img