今天我们一起来了解一个中间件协议框架DDS,它的全称是Data Distribution Service,是一套通信协议和API标准,提供了以数据为中心的连接服务,基于发布者-订阅者模型,提供了介于操作系统和应用程序之间的功能,使得组件之间可以互相通信。强调以数据为中心,提供丰富的QoS服务质量策略,以保障数据进行实时、高效、灵活地分发,可满足各种分布式实时通信应用需求。
标准提供商
DDS本身是一套标准。由Object Management Group(简称OMG)维护。
OMG是一个开放性的非营利技术标准联盟,由许多大型IT公司组成:包括IBM,Apple Computer,Sun Microsystems等。它的使命是开发技术标准,为数以千计的垂直行业提供真实的价值。OMG一直致力于将其由最终用户、供应商、政府机构、大学和研究机构组成的国际成员聚集在一起,随着多年来技术的变化来开发和修订这些标准,其中包括统一建模语言SYSML和UML,还有中间件标准CORBA等,而标准的实现则由其他服务提供商完成。
目前DDS的提供商包括下面这些:
- Vortex OpenSplice
- eProsima Fast RTPS
- Hamersham
- Company Summary Kongsberg Gallium
- MilSOFT
- Object Computing OpenDDS
- Remedy IT
- RTI
- Twin Oaks Computing, Inc.
4个数据通信时代
有了DDS协议后,我们可以大致把数据通信方式划分为4个时代:
- (第一代)点对点的CS(Client-Server)结构,这是大家最为熟悉的:一个服务器角色被许多的客户端使用,每次通信时,通信双方必须建立一条连接。当通信节点增多时,通信的连接数也会增多。并且,每个客户端都必须知道服务器的具体地址和所提供的服务。一旦服务器地址发生变化,所有客户端都会受到影响。
- (第二代)Broker模型:存在一个中间人,它负责初步处理大家的请求,并进一步找到真正能响应服务的角色,这就好像存在一个经纪人。这为客户端提供了一层抽象,使得服务器的具体地址变得不重要了。服务端地址如果发生变化,只需要告诉Broker就可以了。但这个模型的问题在于,Broker变成了模型的中心,它的处理速度会影响所有人的效率,这就好像城市中心的路口,当系统规则增长到一定程度,Broker终究会成为瓶颈。更糟糕的是,如果Broker瘫痪了,可能整个系统都将无法运转。
- (第三代)广播模型:所有人都可以在通道上广播消息,并且所有人都可以收到消息。这个模型解决了服务器地址的问题,且通信双方不用单独建立连接,但它存在的问题是:广播通道上的消息太多,太嘈杂,所有人都必须关心每条消息是否与自己有关。这就好像全公司一千号人坐在同一个房间里面办公一样。
- (第四代)DDS模型:这种模型与广播模型有些类似,所有人都可以在DataBus上发布和读取消息。但它更进一步的是,通信中包含了很多并行的通路,每个人可以只关心自己感兴趣的消息,自动忽略自己不需要的消息。
下图展示了DDS在网络栈中的位置,它位于传输层的上面,并且以TCP,UDP为基础。
分布式系统通信痛点解决
分布式系统中包含了许多的角色需要互相通信,随着角色数量的不断增长,其通信的通道数量会以爆炸式增长。
有了DDS后,就有统一的DataBus,则即便新增了通信角色其通信模型也不会变得更加复杂。
此外对于分布式系统来说,有很多复杂的逻辑需要处理,例如:如何发现其他节点,如何为每个节点分配地址,如何配置消息的可靠性等,这使得应用程序变得臃肿。而如果说通信的中间件能够完全处理好这些逻辑,则应用程序将可以集中处理自己的业务,变得更加敏捷。
DDS 的应用
它的应用非常广泛,广泛到它涉及到了我们每天都要依赖的许多重要行业,例如:航空,国防,交通,医疗,能源等等。下图是一些示例:
对于汽车行业来说,汽车开放系统架构(AUTomotive Open System ARchitecture)已经在AUTOSAR Adaptive Platform 18.03中包含了DDS协议。
另外,DDS的实时特性可能特别适合自动驾驶系统。在这类系统中,通常会存在感知,预测,决策和定位模块,这些需要非常高速和频繁的交换数据。借助DDS,可以很好的满足它们的通信需求。
DDS标准核心规范
在DDS规范中,有以下描述标准的基本文档:
- DDS Specification:描述了以数据为中心的发布-订阅模型。该规范定义了API和通信语义(行为和服务质量),使消息从消息生产者有效地传递到匹配的消费者。DDS规范的目的可以概括为:“能够在正确的时间将正确的信息高效,可靠地传递到正确的位置”。
- DDSI-RTPS:描述了RTPS(Real Time Publish Subscribe Protocol)协议。该协议通过UDP等不可靠的传输,实现最大努力(Best-Effort)和可靠的发布-订阅通信。RTPS是DDS实现的标准协议,它的目的和范围是确保基于不同DDS供应商的应用程序可以实现互操作。
- IDL 定义了IDL,一种用于以独立于编程语言的方式定义数据类型和接口的语言。这不属于DDS标准,但DDS依赖于它。
DDS的通信模型DCPS,如下图:
- 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控制访问、强制数据流路径并实时加密数据。
发布者(publisher)设置发布的主题(topic),数据读者(subscriber)订阅感兴趣的主题。publisher作为发布者角色,至少包含一个DataWriter,并负责创建,删除和管理datawriter。同样,subscriber作为订阅者,至少与一个datareader关联,并负责发布数据,数据发布者通过调用datawriter的write函数发布数据,但数据不会立刻被送出,实际的消息产生是通过publisher和Qos综合控制的。datareader负责订阅数据,订阅方式可采用异步方式(listener),同步方式和非阻塞三种。
DDS的通信协议RTPS建立在传输层之上,可以支持共享内存:
RTPS协议的主要特点包括:
- 性能和服务质量属性,使得实时应用程序能够在标准IP网络上进行最佳努力和可靠的发布-订阅通信;
- 容错,允许创建没有单点故障的网络;
- 可扩展性,允许协议通过新的服务进行扩展和增强,而不会破坏向后兼容性和互操作性;
- 即插即用连接,使新的应用程序和服务自动发现,应用程序可以随时加入和离开网络,而不需要重新配置;
- 可配置性,允许每个数据传递能够平衡可靠性和及时性的要求;
- 模块化,允许简单设备实现协议的子集,同时仍然参与网络;
- 可扩展性,使系统有可能扩展到非常大的网络;
- 类型安全,以防止应用程序编程错误而危及到系统中其他远程节点。
RTPS协议由PIM(Platform Independent Model,平台独立模型)和一组PSM(Platform-Specific Model,平台特定模型)描述。
PIM包含四个模块:结构,消息,行为和发现。结构(Structure)模块定义通信端点。消息(Messages)模块定义这些端点可以交换的消息集合。行为(Behavior)模块定义合法交互集(消息交换)以及它们如何影响通信端点的状态。发现(Discovery)模块定义如何自动发现和配置实体。如图:
PSM负责提供PIM与UDP(或者说底层平台)之间的映射,主要包括各种消息格式。
总结
DDS是一种网络中间件,可以简化网络编程;它实现了一个超越基本发布-订阅模式的机制,用于在节点之间发送和接收数据、事件和命令。产生信息的节点(发布者)创建“主题”(例如,温度、位置、压力)并发布“样本”。 DDS 将样本交付给声明对该主题感兴趣的订阅者。主要好处是使用 DDS 进行通信的应用程序是分离的,很少需要花费设计时间来处理它们的相互交互。特别是,应用程序永远不需要有关其他参与应用程序的信息,包括它们的存在或位置(支持去中心化);DDS 透明地处理消息传递,无需用户应用程序的干预。提供了一个数据空间的方式,属于同一数据空间,访问数据就像通过api来访问内存一样。
后续会再来一起看下DDS的实现,Fast DDS,欢迎关注。
参考资料:
https://paul.pub/dds-and-fastrtps/