不要中断 DDS 系统中的向后兼容性消息



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

"您可以在不中断的情况下向邮件格式中添加新字段向后兼容性;当解析。所以,如果你有一个使用协议的通信协议缓冲区作为其数据格式,您可以扩展您的协议不得不担心破坏现有代码。"

还有其他想法吗?

提前谢谢。

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

类型系统支持类型进化,因此如上所述"发展类型"并保持互操作性在使用不同版本类型的组件之间

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

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

无论你走哪条路,都建议你严格管理数据模型的演变。如果你只让任何人根据自己的喜好添加或删除一些属性,这种情况将很难快速维持。

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

您可以尝试将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;
}
}

最新更新