我参与了一个项目,该项目使用 DDS 作为协议进行通信, C ++ 作为语言。如您所知,交换的消息称为主题。好吧,有时团队必须更改主题定义,因此,依赖于此主题的其他软件停止工作,有必要在任何地方更新主题并重新编译。所以,我的问题是,你知道怎么不打破倒退兼容性吗?我一直在搜索,我找到了谷歌协议缓冲区,他们这样说:
“您可以在不中断的情况下为邮件格式添加新字段 向后兼容性;旧的二进制文件只是忽略了新的字段 解析。因此,如果您有使用协议的通信协议 缓冲区作为其数据格式,您可以无需扩展协议 不得不担心破坏现有代码。“
还有其他想法吗?
提前致谢。
答案 0 :(得分:1)
OMG规范Extensible and Dynamic Topic Types for DDS(或简称DDS-XTypes)解决了您的问题。引自该规范:
Type System支持类型演变,以便可以 如上所述“进化类型”并保持互操作性 在使用不同版本的
的组件之间
并非所有DDS实现当前都支持XType,因此您可能不得不求助于其他解决方案。例如,您可以在主题名称中包含版本编号方案,以避免在不同组件之间键入冲突。为了确保每个组件都能获得所需的正确数据,您可以创建一个服务,负责根据需要在不同版本的主题之间转发。此服务必须知道主题的不同版本,并应注意填充默认值和/或在不同类型之间进行转换。这是否是一个可行的解决方案,取决于您的系统要求。
如果只是为了解决类型演化问题,建议不要在DDS中使用不同类型的系统,如协议缓冲区。您实际上将传输PB消息作为DDS中间件不透明的数据。这意味着您还将丢失一些漂亮的工具功能,如动态发现和类型显示,因为DDS中间件无法理解PB消息。此外,您的应用程序将变得更加复杂,因为它们将负责调用正确的PB de / serialization方法。让DDS更好地处理这一切。
无论您采用哪种方式,建议您严格管理数据模型的演变。如果您让任何人根据自己的喜好添加或删除某些属性,则情况将很难快速维护。
答案 1 :(得分:0)
使用DDS对协议缓冲区的支持程度取决于其实现方式。例如,使用PrismTech的Vortex,您不会失去内容感知,也不会失去动态发现,也不会显示类型,因为中间件及其工具都能理解PB消息。 W.r.t. '填充'基于PB的主题,它符合PB标准并由protoc编译器透明地生成,因此可以说如果你熟悉protobuf(也许不是OMG的IDL替代品),那么你真正受益于DDS和GPB的正确集成,这仍然保留了全球数据空间的优势一个着名的/流行的类型系统(GPB)
答案 2 :(得分:0)
您可以尝试在自己的通信层中包装DDS图层。 定义一组涵盖您所有需求的DDS类型和DDS配置文件。 然后,每个主题将被定义为与其中一个配置文件关联的类型之一。
例如,您可以使用字符串类型和二进制类型。 如果对所有软件使用相同的编译器,甚至可以安全地将C结构memcopy到二进制类型。
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;
}
}