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