新闻中心

News

分布式实时通信——DDS技术


DDS简介


DDS定义:Data Distribution Service 数据分发服务,是新一代分布式实时通信中间件协议,采用发布/订阅体系架构,强调以数据为中心,提供丰富的QoS服务质量策略,以保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。

DDS最早应用在美国海军系统,用于解决军舰系统复杂网络环境中大量软件升级的兼容性问题。在汽车领域,2018年Adaptive AUTOSAR引用了DDS,作为可选择的通信方式之一。目前国内已有主机厂开始研究,主要针对自动驾驶相关需求,工具方面,在汽车电子领域常用的工具厂商也在开发这部分内容。不仅是汽车领域引入DDS,在机器人开发领域,最新升级的ROS2也引入了DDS中间件来传递信息。


企业微信截图_15979139412630.png

AP Development Workflow(图片来源AUTOSAR_EXP_Introduction)

DDS规范


DDS规范是由OMG(Object Management Group)对象管理组织发布的。OMG组织是一个国际性、开放性、非盈利性技术标准联盟,由供应商、终端用户、学术机构、政府机构推动,已经有31年的历史;OMG工作组针对各种技术和行业制定企业集成标准,并开发可为数千个垂直行业提供现实价值的技术标准。


2.png

OMG制定的标准(图片来源OMG官网:https://www.omg.org/index.htm)


DDS的相关标准包括核心协议(DDSI-RTPS,DDS-XTypes,DDS-Security,Interface Definition Language (IDL)…),API(DDS C++ API,DDS Java API),拓展协议(DDS-RPC,DDS-XML…)等13份协议集合。

在分布式系统中,DDS位于操作系统和应用程序之间,支持多种编程语言以及多种底层协议。这便是我们常说的跨平台。


DDS中间件(图片来源DDS-The Proven Data Connectivity Standard for IoT)


DDS发布订阅模型DCPS


讲具体协议之前,我们先熟悉下几个专有名词:

  • Domain:代表一个通信平面,由Domain ID唯一标识,只有在同一个域内的通信实体才可以通信;如果考虑车内通信,可以只划分1个Domain,也可以按照交互规则或其他规则,定义多个Domain;

  • Domain Participant:代表域内通信的应用程序的本地成员身份,简单来说,就是说明同一数据域内的通信成员;

  • Topic:是数据的抽象概念,由TopicName标识,关联相应数据的数据类型(DataType),如果把车内所涉及的所有Topic集合在一起,这样就形成一个虚拟的全局数据空间“Global Data Space”,进一步弱化了节点的概念,所以域参与者已经不是节点的概念了;

  • DataWriter:数据写入者,类似缓存,把需要发布的主题数据从应用层写入到DataWriter中;

  • DataReader:数据读取者,同样可以理解为一种缓存,从订阅者得到主题数据,随之传给应用层;

  • Publisher:发布者,发布主题数据,至少与1个DataWriter关联,通过调用DataWriter的相关函数将数据发出去;

  • Subscriber:订阅者,订阅主题数据,至少与1个DataReader关联。当数据到达时,应用程序可能忙于执行其他操作或应用程序只是等待该消息时,这样就会存在两种情况,同步访问和异步通知。


接下来,我们看一下DDS的通信模型。

根据前面介绍,我们清楚了DDS是一个以数据为中心的中间件协议和API标准,意为用户只关心自己想要的数据,数据通过Topic进行标识,这样发布者根据主题发布数据,订阅者根据自己感兴趣的主题订阅数据。这便是DDS的核心,以数据为中心的发布-订阅模型DCPS(Data-Centric Publish-Subscribe)。


4.png



如果是熟悉的以服务为中心的SOME/IP中间件,我们需要做的是把数据打包成服务,之后服务的消费方向服务提供方通过SD订阅服务中的事件组,当数据发生变化后,相应的事件报文便会发到总线上。相比之下,DDS确实很直接,直接与数据沟通。

QoS服务质量

DDS的另一重要的知识点是支持QoS(Quality of Service),目前共支持22种QoS策略,每种策略都可以应用在不同的角色上,而针对同一角色,可单独使用一种QoS,也可以组合使用多种QoS策略。试想一下,QoS应该如何应用呢?具体能起到什么作用?


5.png



举两个例子:RELIABILITY (可靠性)

参数定义:

Kind = RELIABLE ,如果当网络发生错误, DataReader可能无法收到DataWriter的样本数据时,会对样本数据进行重发,保证DataReader能够收到数据;

Kind = BEST_EFFORT,如果当网络发生错误, DataWriter不会重新发送丢失的样本数据,这样,无法保证DataReader能够收到数据;

如果在DataWriter上应用此QoS策略,设置Kind = RELIABLE,这样保证了DataWriter发布的数据都能被DataReader收到。


LIFESPAN (生命周期)

参数定义:

该QoS的作用是避免交付“过期”的数据,参数为时间duration,默认为无穷大,表示数据样本永远不会失效;如果duration设置为有限数值,同时发送方和接收方的时钟同步,通过在发送端的源时间戳添加定义的duration字段,这样接收方根据时间戳信息计算出数据是否已失效,如果失效了,可以直接删除数据。