DDS简介

DDS,全称 Data Distribution Service (数据分发服务),由对象管理组(OMG®)发布和维护,是一个中间件协议和API标准,采用发布/订阅体系架构,强调以数据为中心,提供丰富的QoS服务质量策略,以保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。

OMG成立于1989年,它的使命是开发技术标准,为数以千计的垂直行业提供真实的价值。OMG一直致力于将其由最终用户、供应商、政府机构、大学和研究机构组成的国际成员聚集在一起,随着多年来技术的变化来开发和修订这些标准,其中包括统一建模语言SYSML和UML,还有中间件标准CORBA等,当然还有今天要说的DDS~

在汽车领域,Adaptive AUTOSAR在2018年引用了DDS,作为可选择的通信方式之一。

DDS的实时性,恰好适合于自动驾驶系统,因此在这类系统中,通常会存在感知,预测,决策和定位等模块,这些模块都需要非常高速和频繁地交换数据

借助DDS,可以很好地满足它们的通信需求。

Image

DDS在其他领域的应用也非常广泛,包括:航空,国防,交通,医疗,能源等。在机器人开发领域,对ROS 2有所了解的人都知道,ROS 2相对于ROS 1最主要的一个变化就是DDS的引入。

Image

DDS标准中的核心规范包括:

DDS v1.4 - 描述了用于分布式应用程序通信和集成的以数据为中心的发布-订阅(DCPS)模型;

DDSI-RTPS v2.3 - 定义了实时发布-订阅交互通信协议(RTPS);

IDL v4.2 - 定义了IDL,一种用于以独立于编程语言的方式定义数据类型和接口的语言。这不属于DDS标准,但DDS依赖于它。

可以看出,和前面几篇讲的SOMEIP不同,DDS的标准体系显然要复杂得多,我今天想介绍的,也只是DCPS和RTPS的一个大概。

DDS的通信模型DCPS,如下图:

Image

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

  • Topic:是数据的抽象概念,由TopicName标识,关联相应数据的数据类型(DataType),把所涉及的所有Topic集合在一起,这样就形成一个虚拟的全局数据空间“Global Data Space”,这里弱化了节点的概念;

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

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

  • QoS:服务质量(Quality of Service),这是DDS的亮点,通过定义灵活的QoS规则,包括可靠性、系统健康(活跃度)甚至安全性,也可以共享数据。DDS在发送它所需要的信息方面很聪明。如果消息不能总是到达它们预期的目的地,那么中间件将在需要的地方实现可靠性。当系统发生变化时,中间件动态地计算出向何处发送哪些数据,并智能地通知参与者这些变化。如果总数据量很大,DDS会智能地过滤并只发送每个端点真正需要的数据。当更新需要快速时,DDS发送多播消息来一次更新许多远程应用程序。随着数据格式的发展,DDS跟踪系统各个部分使用的版本,并自动转换。对于安全性至关重要的应用程序,DDS控制访问、强制数据流路径并实时加密数据。

如图,DDS的通信协议RTPS和SOMEIP一样,建立在传输层之上,不同的是,DDS可以支持共享内存:

Image

RTPS协议的主要特点包括:

  • 性能和服务质量属性,使得实时应用程序能够在标准IP网络上进行最佳努力和可靠的发布-订阅通信;

  • 容错,允许创建没有单点故障的网络;

  • 可扩展性,允许协议通过新的服务进行扩展和增强,而不会破坏向后兼容性和互操作性;

  • 即插即用连接,使新的应用程序和服务自动发现,应用程序可以随时加入和离开网络,而不需要重新配置;

  • 可配置性,允许每个数据传递能够平衡可靠性和及时性的要求;

  • 模块化,允许简单设备实现协议的子集,同时仍然参与网络;

  • 可扩展性,使系统有可能扩展到非常大的网络;

  • 类型安全,以防止应用程序编程错误而危及到系统中其他远程节点。

RTPS协议由PIM(Platform Independent Model,平台独立模型)和一组PSM(Platform-Specific Model,平台特定模型)描述。

PIM包含四个模块:结构,消息,行为和发现。结构(Structure)模块定义通信端点。消息(Messages)模块定义这些端点可以交换的消息集合。行为(Behavior)模块定义合法交互集(消息交换)以及它们如何影响通信端点的状态。发现(Discovery)模块定义如何自动发现和配置实体。如图:

Image

PSM负责提供PIM与UDP(或者说底层平台)之间的映射,主要包括各种消息格式。

为什么说DDS是新一代中间件?我们可以对比看一下其他一些中间件通信模型:

Image

  • 点对点CS(Client-Server)模型:这是我们最熟悉的模式,许多客户端连接到一个服务端,每次通信时,通信双方必须建立一条连接。当通信节点增多时,通信的连接数也会增多。每个客户端都需要知道服务器的具体地址和所提供的服务。一旦服务器地址发生变化,所有客户端都会受到影响。

  • Broker模型:由Broker统一负责初步处理所有人的请求,并进一步找到真正能响应服务的角色。这使得客户端可以不用关心服务器的具体地址。服务端地址如果发生变化,只需要告诉Broker就可以了。这个模型的问题也很明显,Broker作为核心,它的处理速度会影响所有节点的效率,当系统规模增长到一定程度,Broker将成为整个系统的性能瓶颈。对于资源相对吃紧的嵌入式系统,这个问题会更为突出。更糟糕的是,如果Broker发生异常,可能导致整个系统都无法正常运转。

  • 广播模型:所有人都可以在通道上广播消息,并且所有人都可以收到消息。这个模型解决了服务器地址的问题,且通信双方不用单独建立连接,但它存在的问题是:广播通道上的消息太多了,所有人都必须关心每条消息,无论是否与自己有关。

  • 以数据为中心的DDS模型:这种模型与广播模型有些类似,所有人都可以在DataBus上发布和订阅消息。但它的先进之处在于,通信中包含了很多并行的通路,可以只关心自己感兴趣的消息,忽略不感兴趣的消息。

对于分布式系统来说,有很多复杂的逻辑需要处理,例如:如何发现其他节点,如何为每个节点分配地址,如何确保消息的可靠性等。这使得应用程序变得臃肿。如果通信中间件能够完全处理好这些逻辑,则应用程序将可以集中处理自己的业务,变得更加敏捷:

Image

如果考虑系统的演化,问题会更加突出。由于分布式系统中包含了许多的角色需要互相通信,随着角色数量的不断增长,其通信的通道数量会以爆炸式增长,这时传统的通信模型就会变得越来越复杂:

Image

如果有统一的DataBus,即便新增了角色,其通信模型也不会变得更加复杂:

Image

OMG发布的只是DDS标准,而标准的实现是由各个DDS提供商完成,其中有商用的如RTI,也有开源的如Object Computing的OpenDDS、eProsima的FastDDS。

前几年刚知道DDS的时候,只接触了OpenDDS,它依赖ACE(一个我认为只适合学习并不适合实际应用的通信框架),还依赖了我完全不懂的Perl,顿时觉得这玩意咋这么难上手,是不是没啥应用前景,当时网上的资料也比较少,便放弃了。

最近接触了FastDDS,觉得是可以落地的好东西,才又开始研究DDS,下一篇我会介绍FastDDS以及如何使用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值