DDS中间件设计

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间共享信息。这里有三个实现版本:

  1. 共享内存传输 Shared Memory Transport (基本本版)
  2. 数据共享交付 Data Sharing Delivery
  3. 零拷贝 ZERO-COPY communication

上面的图中可见,通过减低Writer、Reader中对消息的备份减少内存的copy。可预见的,越高共享的内存实现越依赖通信同步机制。最终的zero copy方案直接预设A、B节点能实现完美的读写交错。

实际的自动驾驶场景,zero copy是十分必要的。

下图描述的是FastRTPS中的节点使用zero copy的实现。

底层实现原理

低延时、高吞吐量

  • UDP传输
  • 共享内存技术、零拷贝等技术

稳定性

  • 主从负载均衡原理

下面是FastDDS的负载均衡原理的工作流程:

  1. 主节点选举:在FastDDS中,一个节点被选为主节点,它负责协调数据传输以及任务的分发。主节点的选举可能基于配置文件、节点优先级或其他条件。
  2. 从节点注册:通过与主节点建立连接,从节点向主节点注册自己的存在。从节点可以提供资源(例如CPU、内存)的信息,以便主节点进行任务分配时考虑。
  3. 任务分配:当主节点收到发布者的消息后,它会根据当前系统的状态和从节点的资源情况,确定将数据发送给哪些从节点。
  4. 数据传输:主节点将数据分发给各个从节点,并确保数据的可靠传输。每个从节点负责接收并处理它们所分配到的数据。
  5. 状态监控和更新:主节点定期监控各个从节点的状态,包括资源利用率、延迟等。根据这些状态信息,主节点可以动态地重新分配任务,实现动态的负载均衡。
  6. 故障处理和容错:如果主节点发生故障或失去连接,FastDDS系统会根据事先定义的容错策略重新选择一个新的主节点。这样能够保证系统的连续性和可靠性。

参考文献

了解FastDDS、FastRTPS 的底层实现原理 - 知乎 (zhihu.com)

1. Getting Started --- Fast DDS 2.12.0 documentation (eprosima.com)

【linux】图文并茂|彻底搞懂零拷贝(Zero-Copy)技术 - 知乎 (zhihu.com)

相关推荐
李宥小哥8 小时前
Redis13-实践-短信登录
中间件
利刃大大9 小时前
【c++中间件】语音识别SDK && 二次封装
开发语言·c++·中间件·语音识别
晚风吹人醒.17 小时前
缓存中间件Redis安装及功能演示、企业案例
linux·数据库·redis·ubuntu·缓存·中间件
p***q781 天前
docker离线安装及部署各类中间件(x86系统架构)
docker·中间件·系统架构
k***z112 天前
国产化中间件东方通TongWeb环境安装部署(图文详解)
中间件
5***r9352 天前
开源数据同步中间件(Dbsyncer)简单玩一下 mysql to mysql 的增量,全量配置
mysql·中间件·开源
q***06473 天前
SocketTool、串口调试助手、MQTT中间件基础
单片机·嵌入式硬件·中间件
f***24113 天前
【中间件】Pulsar集群安装
中间件
利刃大大3 天前
【c++中间件】redis介绍 && redis-plus-plus库使用
c++·redis·中间件
晨欣4 天前
中间件:IT世界的“中场发动机”与“超级粘合剂”(Gemini 3 pro 回答)
中间件