DDS(Data Distribution Service)

DDS(Data Distribution Service)是一种以数据为中心的发布/订阅(DCPS)通信中间件协议栈标准(由OMG组织维护)。它专为高性能、可预测、实时、可靠的分布式系统设计,广泛应用于国防、航空航天、工业自动化、医疗设备、自动驾驶等领域。


一、DDS 协议栈原理

DDS 的核心思想是构建一个全局数据空间(Global Data Space),参与者(发布者和订阅者)通过读写这个空间中的数据对象(Topics)进行通信,彼此解耦(无需知道对方的存在和位置)。其协议栈是分层的:

  1. DCPS (Data-Centric Publish-Subscribe) 模型层 (核心抽象层)

    • 核心概念

      • 全局数据空间 (Global Data Space)
        • DDS抽象出一个虚拟的全局数据池,应用程序无需感知对方位置,只需读写感兴趣的数据。
        • 发布者 (Publisher) 将数据写入空间,订阅者 (Subscriber) 从中读取数据,实现完全解耦。
      • Domain
        • 逻辑隔离的通信空间,不同Domain的实体互不可见。
        • 参与者(DomainParticipant)必须属于某个Domain(通过Domain ID标识)。
      • DomainParticipant
        • 应用程序在域中的代理,管理发布者、订阅者、主题等实体。
      • Topic
        • 定义了通信的数据类型(struct)和名称。是数据对象在全局数据空间的标识。
        • 包含名称、数据类型(如IDL定义的Struct)和QoS策略。
      • DataWriter
        • 由发布者Publisher创建、管理,用于向特定 Topic 写入数据实例。负责数据序列化、QoS 策略应用、与底层通信交互。
      • DataReader
        • 由订阅者Subscriber创建、管理,用于从特定 Topic 读取数据实例。负责数据反序列化、QoS 策略应用、数据缓存、通知应用程序。
      • Publisher
        • 管理一组 DataWriter,提供发布操作的上下文(如 QoS 继承)。
      • Subscriber
        • 管理一组 DataReader,提供订阅操作的上下文(如 QoS 继承、数据合并)。
      • QoS策略 (Quality of Service)
        • DDS的核心优势,通过20+种QoS策略控制通信行为,例如:
          • RELIABILITY:可靠传输(类似TCP)或尽力传输(类似UDP)。
          • DEADLINE:数据更新的最大允许间隔。
          • LIVELINESS:检测节点存活状态。
          • DURABILITY:持久化数据(支持历史数据提供给新加入的订阅者)。
    • 通信流程

      1. 发布者应用程序通过 DataWriter.write() 发送数据。
      2. DDS 中间件根据 Topic 匹配规则找到订阅同一 Topic 的所有匹配 DataReader
      3. 中间件根据双方的 QoS 策略协商传输可靠性、时效性等。
      4. 数据被序列化并通过底层传输(RTPS)发送。
      5. 订阅者的 DataReader 接收数据,反序列化,放入接收缓存。
      6. 订阅者应用程序通过 DataReader.take()/read() 获取数据。
    • 关键特性

      • 强类型化:基于 IDL (Interface Definition Language) 定义数据结构。
      • 丰富的 QoS 策略:控制通信行为的方方面面(见下文优化部分)。
      • 动态发现:发布者和订阅者自动发现彼此(无需配置中心),基于 Topic 和 QoS 匹配。
  2. RTPS (Real-Time Publish-Subscribe) 协议层 (有线协议)

    • RTPS 是 DDS 的标准互操作有线协议(DDSI-RTPS)。它定义了 DDS 实体如何在网络上交互,确保不同供应商实现的 DDS 中间件可以互操作。
    • 核心概念
      • Participant Discovery Protocol (PDP):用于发现同一域中的其他 DomainParticipants。
      • Endpoint Discovery Protocol (EDP):在已发现的 Participants 之间发现具体的 DataWriters 和 DataReaders,并进行 Topic 和 QoS 匹配。
      • Writer-Reader Protocol (WRP):匹配成功后,DataWriter 和 DataReader 之间进行实际数据传输的协议。
      • 消息结构:定义了标准的 RTPS 消息头(包含 GUID 等标识信息)和子消息(包含数据、心跳、ACK/NACK、GAP 等)。
      • GUID (Globally Unique Identifier):唯一标识 DDS 域内的每个实体(Participant, DataWriter, DataReader)。
      • 序列号 (SequenceNumber):保证数据的有序性和可靠性。
    • 传输机制
      • 通常构建在 UDP/IP 之上,支持单播和多播(对一对多通信效率至关重要)。
      • 实现可靠性:通过 HEARTBEAT, ACKNACK, GAP 等控制消息实现确认、重传、流量控制。
      • 实现实时性:支持 BEST_EFFORTRELIABLE 两种可靠性,低优先级后台控制消息不影响高优先级数据消息。
  3. 传输层

    • RTPS 消息最终通过底层的传输协议发送,最常见的是 UDP/IPv4/IPv6(支持单播/多播)。也可以支持共享内存(同一主机内进程通信)、TCP/IP(穿透防火墙/NAT,但牺牲实时性)、DTLS/TLS(安全传输)等。

二、核心原理剖析

  1. 以数据为中心(Data-Centricity)

    • 核心理念:系统围绕共享的“数据空间”构建,而非围绕发送/接收消息的节点。
    • 全局数据空间:在同一个Domain内的所有参与者共享一个虚拟的全局数据空间。
    • 生产者写数据DataWriter将数据样本写入这个全局空间中的特定Topic
    • 消费者读数据DataReader直接从全局数据空间中读取其订阅的Topic的数据样本。
    • 解耦:生产者和消费者不需要知道彼此的存在(匿名发布订阅),只需约定Topic和数据结构。系统负责将数据从生产者高效、可靠地传递给匹配的消费者。
  2. 发布-订阅(Publish-Subscribe)模型

    • 松耦合通信:发布者和订阅者通过Topic关联,无需直接连接。
    • 多对多通信:一个Topic可以有多个发布者和多个订阅者。
    • 推/拉模式结合:DDS通常采用推送模式(发布者主动推数据),但也支持订阅者按需拉取。
  3. 丰富的服务质量策略(QoS Policies)

    • DDS的核心优势在于其丰富的、可配置的QoS策略,允许开发者精确控制数据传输的行为,满足不同应用场景的苛刻需求。常见关键QoS包括:
      • ReliabilityBEST_EFFORT (可能丢失) 或 RELIABLE (确保送达,需确认和重传)。
      • HistoryKEEP_LAST (保留最新N个样本) 或 KEEP_ALL (保留所有样本)。
      • DurabilityVOLATILE (新订阅者收不到历史数据) / TRANSIENT_LOCAL (新订阅者能收到DataWriter最后发送的数据) / TRANSIENT / PERSISTENT (数据持久化存储)。
      • Deadline:指定DataWriter必须定期更新数据的最大间隔,或DataReader期望接收更新的最大间隔。若违反会触发通知。
      • Latency Budget:允许的最大端到端延迟预算,帮助中间件优化传输路径。
      • LivelinessDataWriter需定期声明“活跃”,若超时未声明,关联的DataReader会收到DataWriter“不活跃”的通知。
      • Ownership / OWNERSHIP_STRENGTH:解决多个DataWriter向同一Topic写数据时的冲突,强度(Strength)最高的DataWriter拥有“所有权”,其数据被传递。
      • Resource Limits:控制内存使用(如最大实例数、最大样本数)。
      • Time Based Filter:为DataReader设置最小接收间隔,过滤掉过于频繁的更新。
      • Transport Priority:指定数据样本的传输优先级。
    • QoS协商:在DataWriterDataReader建立关联时,会进行QoS兼容性检查。只有双方QoS配置兼容(兼容规则由各策略定义)时,通信才会建立。否则,关联失败或降级(取决于Requested vs Offered策略)。
  4. 动态发现(Discovery)

    • 核心机制:DDS节点加入网络时,能自动发现其他节点及其发布/订阅的Topic信息,无需集中注册中心。
    • 过程
      1. Participant DiscoveryDomainParticipant加入域时,广播自身信息并监听其他参与者的信息。
      2. Endpoint Discovery:当两个参与者发现彼此后,它们交换各自拥有的DataWriterDataReader的详细信息(包括支持的Topic和QoS)。
      3. 关联匹配:根据Topic名称、数据类型兼容性(结构兼容)以及QoS兼容性,自动在匹配的DataWriterDataReader之间建立关联。
    • 优势:实现即插即用(Plug-and-Play),系统高度动态,节点可随时加入或离开。
  5. 数据模型与实例管理

    • 键控数据(Keyed Data):可以为Topic定义一个或多个字段作为Key。具有相同Key值的数据样本属于同一个数据实例
    • 实例生命周期:DDS跟踪每个实例的生命周期状态(ALIVE, NOT_ALIVE_DISPOSED, NOT_ALIVE_NO_WRITERS)。
    • 样本管理DataReader可以按实例读取数据(获取特定Key实例的最新值或历史值)。
  6. 传输协议抽象

    • DDS标准定义了数据交付的行为和接口,并不强制底层传输协议。
    • 实际实现(如RTI Connext DDS, Eclipse Cyclone DDS, OpenDDS)通常支持多种传输协议:
      • UDP/IP Multicast:高效组播,适合一对多广播场景,是DDS默认或常用传输方式。
      • UDP/IP Unicast:单播。
      • TCP/IP:提供可靠有序传输,但延迟和开销可能高于UDP。
      • 共享内存:同一主机内进程间通信,速度极快。
      • 自定义/专有传输:如某些RTOS上的专有协议。
    • 传输插件:很多实现允许用户自定义传输插件。

三、DDS协议栈工作流程

  1. 初始化:应用程序创建DomainParticipant,加入指定Domain
  2. 定义Topic:创建Topic对象,指定名称和数据类型。
  3. 创建发布端
    • 创建Publisher
    • 创建DataWriter,关联到Topic,并配置QoS。
    • DataWriter注册后,其信息(Topic, QoS)被纳入发现过程。
  4. 创建订阅端
    • 创建Subscriber
    • 创建DataReader,关联到Topic,并配置QoS(需与目标DataWriter兼容)。
    • DataReader注册后,其信息被纳入发现过程。
  5. 自动发现与匹配
    • 发布端和订阅端的DomainParticipant相互发现。
    • 发布端的DataWriter和订阅端的DataReader相互发现。
    • 检查Topic匹配和QoS兼容性。兼容则建立关联。
  6. 数据通信
    • 发布端应用调用DataWriter.write()写入数据样本。
    • DDS中间件根据QoS(可靠性、持久性等)处理数据(可能缓存、重传、过滤)。
    • 数据通过配置的传输协议发送。
    • 接收端中间件收到数据,根据QoS处理(缓存、排序、去重等)。
    • 订阅端应用通过DataReader.read()take()(读取并移除缓存)获取数据样本(或监听监听器/等待条件变量)。
  7. 生命周期结束:应用程序按顺序销毁各实体,释放资源。

四、DDS的优势

  • 极低延迟与高吞吐量:优化的协议和实现(如零拷贝、多播)满足实时性要求。
  • 强可靠性:通过RELIABLE QoS和确认重传机制保证关键数据不丢失。
  • 动态可扩展性:自动发现机制支持节点动态加入退出。
  • 细粒度QoS控制:丰富的策略满足多样化需求(实时性、可靠性、资源限制等)。
  • 以数据为中心:更符合分布式系统中数据流共享的本质。
  • 平台与语言无关性:标准定义了IDL和API映射(C, C++, Java, C#, Python等)。
  • 容错性:冗余配置(如多发布者、持久性)可提高系统鲁棒性。

总结

DDS协议栈 是一个强大的、标准化的、以数据为中心的发布-订阅通信中间件协议栈。其核心在于全局数据空间的概念、丰富的可配置QoS策略以及完全去中心化的动态发现机制。这些特性使其在需要高性能、高可靠性、强实时性、动态拓扑和复杂数据流管理的分布式系统中成为理想选择。理解其DCPS模型、QoS协商机制和自动发现原理是掌握DDS的关键。选择合适的DDS实现并正确配置QoS对于构建成功的DDS应用至关重要。

  1. QoS是灵魂:精确配置和权衡 QoS 策略以满足应用需求(可靠性、实时性、资源限制)是首要任务。
  2. 网络是关键:充分利用多播,优化网络配置(MTU, 接口绑定),启用硬件加速。
  3. 内存零拷贝是加速器:在高性能场景,零拷贝 API 能带来显著提升。
  4. 发现需谨慎:控制发现流量,在大规模部署中考虑静态发现或优化发现参数。
  5. 资源有限制:务必设置合理的 RESOURCE_LIMITS
  6. 工具不可少:善用监控和分析工具定位问题。

没有放之四海而皆准的最优配置,最佳实践来自于对 DDS 原理的深刻理解、对应用需求的精确把握、对运行环境的透彻了解以及持续的测量和调优。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/85331.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/85331.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python爬虫关于多进程,多线程,协程的使用

简介: python其实没有真正意义的多线程,因为有GIL锁存在,但是python3.13去掉GIL锁,有两个版本,python3.13t和python3.13,python3.13去掉GIL锁相当于python底层大规模改变,肯定会影响一些库的使…

java 设计模式_行为型_23状态模式

23.状态模式 Java中的状态设计模式是一种软件设计模式,当对象的内部状态更改时,该模式允许对象更改其行为。状态设计模式通常用于以下情况:对象取决于其状态,并且在运行期间必须根据其内部状态更改其行为。状态设计模式是许多行为…

Flink CDC MySQL 时区相差 8 小时问题优雅解决方式

Flink CDC MySQL 时区相差 8 小时问题解析 代码运行环境 Flink 1.15 + FlinkCDC 2.4.0 + jdk1.8 +springboot 2.31、原因分析 Flink CDC 底层使用 Debezium 连接器来捕获 MySQL 的数据变更,而 Debezium 在解析 MySQL 的 binlog 日志时,默认使用 UTC 时区来处理时间字段。若…

如何在 MX Linux 上安装 Blender CAD 软件

Blender 是一款免费且开源的 CAD 软件,可用于 3D 动画、建模、动态图形、纹理处理、电脑游戏、UV 展开等。同时它也是一款专业的开源程序,是商业软件(如 Maya 或 Cinema 4D)的替代品,支持导入或导出标准格式,如 OBJ、FBX、3DS、PLY 和 STL。Blender 还可以作为视频编辑软…

电脑上的.ssh目录只做什么的

.ssh 目录的作用和来源 系统自动创建 这个目录是在你第一次使用SSH相关功能时自动创建的比如第一次执行 ssh 命令连接服务器时或者使用Git通过SSH协议克隆代码时 主要用途 SSH密钥存储 - 存放公钥/私钥对已知主机记录 - known_hosts 文件记录你连接过的服务器指纹SSH客户端…

Excel大厂自动化报表实战(互联网金融-数据分析周报制作下)

这是Excel大厂自动化报表实战第四期--互联网金融-数据分析周报制作下 数据资源已经与这篇博客捆绑,有需要者可以下载通过网盘分享的文件:2.4自动化报表-8月成交数据.xlsx,2.4自动化报表-8月获客数据.csv等2个文件 链接: https://pan.baidu.c…

界面组件DevExpress WPF中文教程:Grid - 节点(Nodes)概述

DevExpress WPF拥有120个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序,这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

开源统一数据库管理平台完全指南:私有化部署方案与技术解析

摘要:面对MySQL、Oracle、Redis等混合数据库环境,如何实现统一管控?本文深度评测5大开源平台,附私有化部署方案和性能对比。 一、核心需求场景与技术选型 典型痛点: #mermaid-svg-LuCYYyJjBakpzzFH {font-family:"trebuchet ms",verdana,arial,sans-serif;font…

hot100 -- 14.贪心算法

1.买卖股票的最佳时机 方法&#xff1a; def MaxProfit(prices):max_pro, min_num 0, float(inf)for num in prices:if num < min_num:min_num nummax_pro max(max_pro, num - min_num)return max_pro 2.跳跃游戏 问题&#xff1a; 给你一个非负整数数组 nums &#…

Celery+fastAPI/Flask实现高性能应用

本文在创作过程中借助 AI 工具辅助资料整理与内容优化。图片来源网络。 引言 大家好&#xff0c;我是沛哥儿。 在当今的软件开发领域&#xff0c;异步任务处理和高效的 Web 开发框架是提升应用性能和可扩展性的关键因素。Celery 作为一个强大的分布式任务队列系统&#xff0c;…

【音视频】PJSIP库——pjsua命令使用详解

1、源码编译 1)安装依赖库 sudo apt install libsrtp2-dev sudo apt install libopus-dev alsa-tools libalsaplayer-dev ffmpeg libalsa* pulseaudio-module-jack sudo apt install jackd libjack-jackd2-dev libjack-dev libsdl2-dev libv4l-dev libavcodec-dev libavde…

Python实例题:图片批量处理工具

目录 Python实例题 题目 问题描述 解题思路 关键代码框架 难点分析 Python实例题 题目 图片批量处理工具 问题描述 开发一个 Python 工具&#xff0c;实现以下功能&#xff1a; 遍历指定文件夹下的所有图片文件&#xff08;支持常见格式如 jpg、png、webp&#xff0…

超图superMap iObjects for Java的Jar使用中遇到的问题

一、 cannot open shared object file: No such file or directory 1. 问题 2. 解决方法 &#xff08;1&#xff09;检查有没有配置环境变量 PATH &#xff08;2&#xff09;创建软连接 ln -s &#xff08;3&#xff09;将主机 /usr/lib64 目录中的libgomp.so.1 复制到 /pla…

常见的蓝牙5.0抗干扰技术和算法

常见的蓝牙5.0抗干扰技术和算法&#xff1a; 跳频扩频&#xff08;Frequency Hopping Spread Spectrum, FHSS&#xff09; 通过在不同的频率通道上快速切换数据传输&#xff0c;减少与固定频率干扰源的冲突。 直接序列扩频&#xff08;Direct Sequence Spread Spectrum, DSSS&…

牛客与Moka深化合作,升级AI面试对接,引领招聘变革

近日&#xff0c;AI 招聘平台牛客与国内领先的人力资源全模块平台 Moka 宣布完成 AI 面试产品的全新对接升级。此次升级实现了从 Moka 到牛客的一键互绑&#xff0c;并打通了简历出题、风险点提问、优势技能挖掘等核心功能&#xff0c;为企业提供更加高效智能的面试体验。 这一…

Vue 3 路由跳转全面指南(Composition API + <script setup>)

一、前言&#xff1a;为什么要学习 Vue Router&#xff1f; 在单页面应用(SPA)开发中&#xff0c;路由管理是核心功能之一。Vue Router 作为 Vue.js 官方推荐的路由解决方案&#xff0c;与 Vue.js 深度集成&#xff0c;提供了以下重要功能&#xff1a; 页面无刷新跳转&#x…

JavaScript基础-常用的键盘事件

一、前言 在网页开发中&#xff0c;用户交互 是非常重要的一环。除了鼠标操作之外&#xff0c;键盘事件也是前端开发中最常见的交互方式之一。 JavaScript 提供了多个用于监听和处理键盘输入的事件&#xff0c;例如 keydown、keyup 和 keypress。掌握这些事件可以帮助我们实现…

解决 Android 项目下载依赖缺失导致的问题

解决 Android 项目下载依赖缺失导致的问题 在项目根目录下的 build.gradle 文件中增加下面的代码&#xff1a; buildscript {repositories {...maven {url "https://maven.aliyun.com/repository/jcenter"}maven {url "https://maven.aliyun.com/repository/c…

Clang Code Model: Error: The clangbackend executable “D:\Soft\Qt5.12.12\Tool

Qt Creator->菜单->帮助->关于插件->C>去掉ClangCodeModel勾选->重启Qt Creator 参考&#xff1a;【问题解决】Qt Creator 报错&#xff1a;Clang Code Model: Error: The clangbackend executable_qt clang code model-CSDN博客

高频面试之12 HBase

12 HBase 文章目录 12 HBase12.1 HBase存储结构12.2 HBase的写流程12.3 HBase的读流程12.6 HBase的合并12.7 RowKey设计原则12.8 RowKey如何设计12.9 HBase二级索引原理 12.1 HBase存储结构 架构角色&#xff1a; 1&#xff09;Master 实现类为HMaster&#xff0c;负责监控集群…