Skip to content

DDS XTypes:类型系统的动机与规范构成 ​

DDS 常被概括为「发布订阅中间件」,但它在规范层面对数据的管理比一般消息队列多得多:数据长什么样、类型如何演进、不同厂商的实现如何互认,这些都由规范统一定义。承担这一职责的是 XTypes(Extensible and Dynamic Topic Types for DDS,OMG 当前正式版本 1.3,2020 年 2 月发布)。本文说明 DDS 为什么需要一套类型系统,以及 XTypes 规范涵盖哪些内容,读完可以对 XTypes 的定位与范围建立整体认识。

DDS 为什么需要类型系统 ​

DDS 不只是把字节流从 A 搬到 B,它要支撑分布式系统里长期、可靠、可演进的数据对象分发。要做到这一点,通信双方必须对「数据长什么样、如何演进、是否兼容」有一套可机器判断的共同语言,这就是类型系统的由来。

DDS 主题需要关联特定的数据类型,由此获得三类能力。

自定义类型的收发接口。应用提交给 DDS 和从 DDS 获取的是主题关联的自定义数据结构对象,而不是裸缓冲区:

  • 序列化/反序列化从应用下沉到中间件,由中间件统一处理端序、对齐、跨语言类型转换;
  • 类型检查前移,部分问题在编译期即可暴露;
  • 代价是使用门槛:即便是简单收发,也需要 IDL 编译器生成支持代码。

数据筛选。DDS 提供类似数据库的实时数据存储与查询能力:

  • 主题数据按 key 组织成实例,订阅端可以只读取特定 key 值的数据;
  • 内容过滤:订阅端配置只关心某个成员的范围,DDS 自动过滤不属于该范围的数据。

跨厂商互联互通。不同厂商的 DDS 产品遵循相同的类型规范,支持的数据类型互认;序列化方式规范化之后,A 厂家序列化的数据可以由 B 厂家反序列化还原成相同类型的样本数据。

「以数据为中心」是 DDS 与其他消息中间件的重要区别,XTypes 是实现这一特性的核心规范。

XTypes 规范的五个部分 ​

部分 解决的问题
类型系统 支持哪些数据类型、语法规则、类型如何演进
类型描述 用什么格式描述一个类型
数据序列化 类型实例如何序列化成字节流
语言绑定 类型如何映射到具体编程语言
DCPS 扩展 与 DCPS 规范如何衔接

类型系统 ​

类型系统是 XTypes 的主体,覆盖四块内容:

  • 类型描述:模块(module)、基本类型((U)Int8/16/32/64、Float32/64/128、Byte、Boolean、Char8/Char16)、字符串(String8/String16)、构造类型(结构体、联合、枚举、位掩码、数组、序列、映射);
  • 注解:@key、@final / @appendable / @mutable、@id、@range、@unit 等,为类型附加语义信息;
  • 可扩展性:定义类型允许的演进方式,是 XTypes 最核心的能力;
  • 动态类型:DynamicType / DynamicTypeBuilder 等接口,支持在运行时构建类型,不依赖编译期 IDL 生成代码。

可扩展性分三级:

级别 允许的演进 互通含义
FINAL 不允许修改类型 类型严格封闭,端上类型必须一致
APPENDABLE 只能在末尾追加成员 新旧版本可以互通,旧端忽略新增成员
MUTABLE 可增删、重排成员 按成员 ID(@id)匹配,自由度最高,序列化开销也最大

这一分级让「数据模型在线演进」成为可能:发布端升级了类型,订阅端不重编也能继续正确收数据,这正是长期运行的分布式系统需要的能力。

类型描述 ​

同一个类型可以用多种格式描述:IDL 是最常用的编辑格式,XML 用于工具间交换,TypeObject / TypeIdentifier 则是类型在线协商的载体——参与者在发现阶段交换类型标识,不需要事先共享 IDL 文件。

数据序列化 ​

XTypes 定义了两代 CDR 编码:

  • XCDR1:PLAIN_CDR 与 PL_CDR(参数化 CDR);
  • XCDR2:PLAIN_CDR2、DELIMIT_CDR2 与 PL_CDR2,对齐上限从 XCDR1 的 8 字节收紧到 4 字节。

用哪一代编码由 DataRepresentation QoS 协商决定,这也是新旧版本互通的机制之一。

语言绑定 ​

规定 IDL 类型到 C++、C、Java 等语言的映射规则,保证不同语言、不同厂商实现生成一致的数据表示。

DCPS 扩展 ​

XTypes 向 DCPS 规范补充了两个 QoS 策略与一个内置服务:DataRepresentationQosPolicy 选择数据编码表示,TypeConsistencyEnforcementQosPolicy 约束订阅端接受类型匹配的严格程度,TypeLookup 内置服务提供类型查询与发现。

要点 ​

  • DDS 的「以数据为中心」建立在类型系统之上:序列化下沉、按 key 组织、内容过滤、跨厂商互认都依赖类型规范
  • XTypes 覆盖五个部分:类型系统、类型描述、数据序列化、语言绑定、DCPS 扩展
  • 可扩展性三级(FINAL / APPENDABLE / MUTABLE)解决类型在线演进与互通问题,是 XTypes 的核心价值
  • TypeObject 机制让参与者在发现阶段即可完成类型协商,不依赖编译期共享 IDL
最近更新

基于 VitePress 构建