3

我参与了一个使用DDS作为通信协议和C++作为语言的项目。如您所知,交换的消息称为主题。好吧,有时团队必须更改主题定义,因此,依赖于该主题的其他软件停止工作,有必要在各处更新主题并重新编译。所以,我的问题是,你知道如何不破坏向后兼容性吗?我一直在搜索,我找到了谷歌协议缓冲区,他们这样说:

“您可以在不破坏向后兼容性的情况下向消息格式添加新字段;旧的二进制文件在解析时只会忽略新字段。因此,如果您有一个使用协议缓冲区作为其数据格式的通信协议,您可以扩展您的协议而无需担心破坏现有代码。”

还有什么想法吗?

提前致谢。

4

3 回答 3

2

OMG 规范DDS 的可扩展和动态主题类型(或简称 DDS-XTypes)解决了您的问题。从该规范中引用:

类型系统支持类型演化,因此可以如上所述“演化类型”并保持使用不同版本类型的组件之间的互操作性

目前并非所有 DDS 实现都支持 XType,因此您可能不得不求助于不同的解决方案。例如,您可以在主题名称中包含版本编号方案,以避免不同组件之间的键入冲突。为了确保每个组件都接收到所需的正确数据,您可以创建一个服务,负责根据需要在不同版本的主题之间进行转发。该服务必须了解不同版本的主题,并且应该注意填充默认值和/或在它们的不同类型之间进行转换。这是否是一个可行的解决方案取决于您的系统要求。

如果只是为了解决类型演化问题,不建议在 DDS 中使用不同的类型系统,如 Protocol Buffers。本质上,您将 PB 消息作为对 DDS 中间件不透明的数据进行传输。这意味着您还将失去一些不错的工具功能,例如动态发现和类型显示,因为 DDS 中间件不理解 PB 消息。此外,您的应用程序将变得更加复杂,因为它们将负责调用正确的 PB 反序列化方法。让 DDS 处理所有这些更容易。

无论您采取哪种方式,都建议您严格管理数据模型的演变。如果您让任何人根据自己的喜好添加或删除某些属性,那么情况将变得难以快速维护。

于 2015-11-16T01:46:37.330 回答
0

您可以尝试将 DDS 层包装在您自己的通信层中。定义一组满足您所有需求的 DDS 类型和 DDS 配置文件。然后每个主题将被定义为与这些配置文件之一相关联的那些类型之一。

例如,您可以有一个字符串类型和一个二进制类型。如果您对所有软件使用相同的编译器,您甚至可以安全地将 C 结构体内存复制到二进制类型。

module atsevents {
valuetype DataType {
    public string<128> mDataId;
    public boolean mCustomField1;
    public boolean mCustomField2;
};
valuetype StringDataType : DataType {
    public string<128> mDataKey; //@key
    public string<1024> mData;
};
valuetype BinaryDataType : DataType {
    public string<128> mDataKey; //@key
    public sequence<octet, 1024> mData;
    public unsigned long mTypeHash;
}
}
于 2016-03-17T07:23:17.483 回答
0

DDS 对协议缓冲区的支持级别取决于其实现方式。例如,使用 PrismTech 的 Vortex,您不会失去内容感知、动态发现或类型显示,因为中间件及其工具都理解 PB 消息。Wrt“填充”您基于 PB 的主题,这符合 PB 标准并由 protoc 编译器透明地生成,因此可以说如果您熟悉 protobuf(也许不熟悉 OMG 的 IDL 替代方案),那么您真的可以受益于 DDS 和 GPB 的适当集成,它保留了全局数据空间的优势,但 icw 是一个众所周知/流行的类型系统 (GPB)

于 2015-11-26T10:39:44.730 回答