OpenDDS、FastDDS数据分发服务中间件设计
软件架构
- 应用层
- DDS层
- RTPS层
- 传输层
软件层次
FastDDS整体架构如下,这里可以看到DDS和RTPS的关系。另外缺少一部分IDL(统一描述语言),其应该是Pub、Sub的反序列化、序列化工具。
在RTPS层,主角是Writer&Reader,其接口复杂和灵活。DDS层,主角是Publisher&Subscriber。
执行模型
FastDDS中每个节点(也叫 DomainParticipant)具有:
- 一个 主程序线程(用户持有)
- 一个 事件和周期性任务的线程
- 一个 异步发送线程,用于用户完成写入数据后,异步得完成网络通信
- 多个 接收线程,每个reception channel,取决于传输层的实现方式
网络传输
在传输上,Fast-RTPS支持以下五种传输方式:
- UDPv4
- UDPv6
- TCPv4
- TCPv6
- SHM(共享内存)
当 Participant 创建时,会自动的配置两个传输通道:
- SHM:使用同一个机器上的参与者通信
- UDPv4:同来与跨机器的参与者通信
RTPS的通信SHM实现
在同一Host中,RTPS会采用更高效的SHM(shared memory)方式在participant间共享信息。这里有三个实现版本:
- 共享内存传输 Shared Memory Transport (基本本版)
- 数据共享交付 Data Sharing Delivery
- 零拷贝 ZERO-COPY communication
上面的图中可见,通过减低Writer、Reader中对消息的备份减少内存的copy。可预见的,越高共享的内存实现越依赖通信同步机制。最终的zero copy方案直接预设A、B节点能实现完美的读写交错。
实际的自动驾驶场景,zero copy是十分必要的。
下图描述的是FastRTPS中的节点使用zero copy的实现。
底层实现原理
低延时、高吞吐量
- UDP传输
- 共享内存技术、零拷贝等技术
稳定性
- 主从负载均衡原理
下面是FastDDS的负载均衡原理的工作流程:
- 主节点选举:在FastDDS中,一个节点被选为主节点,它负责协调数据传输以及任务的分发。主节点的选举可能基于配置文件、节点优先级或其他条件。
- 从节点注册:通过与主节点建立连接,从节点向主节点注册自己的存在。从节点可以提供资源(例如CPU、内存)的信息,以便主节点进行任务分配时考虑。
- 任务分配:当主节点收到发布者的消息后,它会根据当前系统的状态和从节点的资源情况,确定将数据发送给哪些从节点。
- 数据传输:主节点将数据分发给各个从节点,并确保数据的可靠传输。每个从节点负责接收并处理它们所分配到的数据。
- 状态监控和更新:主节点定期监控各个从节点的状态,包括资源利用率、延迟等。根据这些状态信息,主节点可以动态地重新分配任务,实现动态的负载均衡。
- 故障处理和容错:如果主节点发生故障或失去连接,FastDDS系统会根据事先定义的容错策略重新选择一个新的主节点。这样能够保证系统的连续性和可靠性。
参考文献
了解FastDDS、FastRTPS 的底层实现原理 - 知乎 (zhihu.com)
1. Getting Started — Fast DDS 2.12.0 documentation (eprosima.com)
【linux】图文并茂|彻底搞懂零拷贝(Zero-Copy)技术 - 知乎 (zhihu.com)