CyberRt源码剖析--06基于有向图的拓扑机制设计
6.1 拓扑图中的角色定义
在发布-订阅架构的基础上,进一步抽象出拓扑图中的角色,以清晰描述节点间的通信关系。如图所示,拓扑图中的核心角色包括Publisher(发布者)、Subscriber(订阅者)和Node(节点)。这些角色的定义如下:
Publisher(发布者):负责生成并发布数据的实体,对应于前文所述的Transmitter。一个Publisher通过指定的Channel发布数据,其身份由Identity和RoleAttributes唯一标识。
Subscriber(订阅者):负责订阅并接收数据的实体,对应于Receiver。一个Subscriber通过订阅特定的Channel获取数据,并通过回调函数处理接收到的信息。
Node(节点):通信平面中的基本管理单元,一个Node可以同时包含多个Publisher和Subscriber。在一个进程中,可创建多个Node,Node通过Transport层提供的接口创建和管理这些角色,并维护其与外部节点的连接关系。

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标识就被设置为拓扑图的边。

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的标识 |

6.4 拓扑机制设计









![Xhyper剖析[6]--中断虚拟化](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-6-%E4%B8%AD%E6%96%AD%E8%99%9A%E6%8B%9F%E5%8C%96/17689244713913.png)
![Xhyper剖析[5]--MMIO虚拟化](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-5-MMIO%E8%99%9A%E6%8B%9F%E5%8C%96/17689243819381.png)
![Xhyper剖析[4]--XhyperCPU虚拟化](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-4-XhyperCPU%E8%99%9A%E6%8B%9F%E5%8C%96/17689241119091.png)
![Xhyper剖析[3]--Xhyper内存虚拟化](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-3-Xhyper%E5%86%85%E5%AD%98%E8%99%9A%E6%8B%9F%E5%8C%96/176892388736321.png)
![Xhyper剖析[2]--Xhyper启动](/2026/01/20/Xhyper%E5%89%96%E6%9E%90-2-Xhyper%E5%90%AF%E5%8A%A8/17689237041079.png)