不要在DDS系统中破坏向后兼容性消息。

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

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

还有其他想法吗?

提前致谢。

3个回答

2
OMG规范DDS的可扩展和动态主题类型(或简称DDS-XTypes)解决了您的问题。引用该规范:
“类型系统支持类型演变,因此可以像上面描述的那样‘演变类型’并保持使用不同版本类型的组件之间的互操作性。”
并非所有的DDS实现都支持XTypes,因此您可能需要采用不同的解决方案。例如,您可以在Topic名称中包含版本编号方案,以避免不同组件之间的类型冲突。为了确保每个组件接收到其所需的正确数据,您可以创建一个服务,负责根据需要在不同版本的Topics之间进行转发。该服务必须了解不同版本的Topics,并应负责填充默认值和/或在它们之间进行转换。是否采用这种解决方案取决于诸多因素,包括您的系统要求。
在DDS中使用不同的类型系统(如Protocol Buffers)仅为解决类型演化问题是不推荐的。这样做实际上是将PB消息作为对DDS中间件不透明的数据进行传输。这意味着您也会失去一些好用的工具功能,例如动态发现和显示类型,因为DDS中间件无法理解PB消息。此外,您的应用程序会变得更加复杂,因为它们需要负责调用正确的PB序列化/反序列化方法。让DDS处理所有这些事情会更容易。
无论您选择哪种方法,都建议您严格管理数据模型演化。如果您让任何人随意添加或删除属性,情况很快就会变得难以维护。

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;
}
}

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接