为什么 DDS 规范要定义这么复杂的一个类型规范?
DDS 之所以在规范里要定义“类型规范(Type System / Type Representation)”,根本原因是:DDS 不只是“把字节流从 A 发到 B”,它要在分布式系统里长期、可靠、可演进地分发“数据对象”。要做到这一点,通信双方必须对“数据长什么样、如何演进、是否兼容”有一套可机器判断的共同语言,而这就需要类型规范。
DDS 主题需要关联某个特定的数据类型,并具备以下这些能力使得 DDS 表现的像能够理解业务数据一样。
- 自定义类型相关的发送/接收接口,即提交给 DDS 和从 DDS 中获取的是主题关联的自定义数据结构对象。
- 优势
- 序列化/反序列化的工作从应用下沉到中间件,由中间件考虑端序/对齐/不同语言类型的转换;
- 类型检查,在编译期即可检查出部分问题;
- 劣势
- 使用复杂,即便是简单的收发也需要 IDL 编译器编译支持代码;
- 优势
- 数据筛选,DDS 提供类似于数据库的实时数据存储与查询的功能,包括:
- 将主题数据按照 key 值组织,比如订阅端可以仅读取特定 key 值的数据;
- 内容过滤,即订阅端可以配置只关心某个成员范围之间的值,DDS 将自动过滤不属于这个范围的主题数据;
- 类型规范是不同 DDS 产品互联互通的基础
- 产品遵循相同的规范使得能够支持的数据类型互认;
- 数据样本序列化方式规范使得 A 厂家的 DDS 产品序列化的数据可以由 B 厂家的 DDS 产品反序列化还原成相同类型的样本数据;
以数据为中心是 DDS 与其他消息中间件的一个重要的区别。DDS-XTypes 是实现以数据为中心的核心协议。DDS-XTypes 规范的主要内容参见下图,主要内容包括:
- 类型系统,支持的数据类型及其语法规则,更进一步的描述了类型如何演进;
- 类型描述,采用何种格式来描述数据类型;
- 数据序列化,采用什么方式序列化数据类型实例;
- 语言绑定,如何映射为特定的开发语言;
- DDS 相关扩展,描述该规范与 DCPS 规范如何关联并扩展 DCPS 规范。
