fastdds.type_propagation 详解
fastdds.type_propagation 是 Fast DDS 中用于控制类型信息传播的 PropertyPolicyQos 属性,属于 非标准 QoS 策略(Non-consolidated QoS)。该属性决定了 DomainParticipant 如何在网络中传播和接收类型定义信息。
- 基本概念
类型传播(Type Propagation)是 Fast DDS 远程数据类型发现(Remote Data Types Discovery) 机制的核心部分,包括:
TypeObject 注册:将本地类型信息注册到 TypeObjectRegistry
EDP 消息传输:在端点发现阶段(EDP)附加类型元信息
类型查找服务:通过 TypeLookup Service 动态获取远程类型定义 - 属性配置
参数定义
Table
Copy
属性名 取值 默认值 描述
fastdds.type_propagation "disabled" / "enabled" / "minimal_bandwidth" / "registration_only" "enabled" 控制类型信息的传播方式
四种模式对比
Table
Copy
模式 TypeObject 注册 EDP 发送类型信息 EDP 接收类型信息 TypeLookup 服务响应
disabled ❌ 不注册 ❌ 不发送 ❌ 忽略接收 ❌ 禁用
enabled ✅ COMPLETE 和 MINIMAL ✅ COMPLETE 和 MINIMAL ✅ 处理接收 ✅ 启用
minimal_bandwidth ✅ 仅 MINIMAL ✅ 仅 MINIMAL ✅ 仅处理 MINIMAL ✅ 启用
registration_only ✅ COMPLETE 和 MINIMAL ✅ COMPLETE 和 MINIMAL ❌ 忽略接收 ❌ 禁用 - 各模式详解
模式 1:disabled(完全禁用)
使用场景:类型信息完全预定义,无需动态发现
cpp
Copy
DomainParticipantQos pqos;
pqos.properties().properties().emplace_back(
"fastdds.type_propagation",
"disabled");
// 效果:
// 1. 不注册任何 TypeObject
// 2. 不发送类型信息
// 3. 忽略接收的类型信息
// 4. 禁用 TypeLookup 服务
适用情况:
所有参与者使用相同的 IDL 文件编译
类型信息通过静态配置(如 XML 文件)加载
对带宽要求极高,希望消除类型发现开销
模式 2:enabled(完全启用 - 默认)
使用场景:标准动态类型发现
cpp
Copy
DomainParticipantQos pqos;
pqos.properties().properties().emplace_back(
"fastdds.type_propagation",
"enabled"); // 或不设置(默认)
// 效果:
// 1. 注册 COMPLETE 和 MINIMAL 两种 TypeObject
// 2. EDP 消息包含完整类型信息
// 3. 处理接收的类型信息
// 4. 启用 TypeLookup 服务
特点:
功能最完整:支持所有 X-Types 特性
带宽开销最大:EDP 消息可能较大
兼容性最好:与所有 Fast DDS 版本兼容
模式 3:minimal_bandwidth(最小带宽)
使用场景:类型信息相似但非完全相同
cpp
Copy
DomainParticipantQos pqos;
pqos.properties().properties().emplace_back(
"fastdds.type_propagation",
"minimal_bandwidth");
// 效果:
// 1. 仅注册 MINIMAL TypeObject
// 2. EDP 仅发送 MINIMAL 类型信息
// 3. 仅处理接收的 MINIMAL 信息
// 4. 启用 TypeLookup 服务(按需获取完整类型)
优势:
减少 EDP 带宽:MINIMAL TypeObject 体积更小
按需获取:通过 TypeLookup Service 动态获取完整类型
平衡性能与功能:适合类型差异较小的场景
模式 4:registration_only(仅注册)
使用场景:仅提供类型信息,不关心远程类型
cpp
Copy
DomainParticipantQos pqos;
pqos.properties().properties().emplace_back(
"fastdds.type_propagation",
"registration_only");
// 效果:
// 1. 注册 COMPLETE 和 MINIMAL TypeObject
// 2. EDP 发送完整类型信息
// 3. 忽略接收的类型信息(不处理)
// 4. 禁用 TypeLookup 服务
适用情况:
只发布不订阅:如传感器数据发布节点
类型信息单向流动:中心节点提供类型定义,边缘节点仅接收
- XML 配置示例
xml
Copy
<?xml version="1.0" encoding="UTF-8" ?> fastdds.type_propagation disabled
<!-- 最小带宽模式 -->
<participant profile_name="minimal_bandwidth">
<rtps>
<propertiesPolicy>
<properties>
<property>
<name>fastdds.type_propagation</name>
<value>minimal_bandwidth</value>
</property>
</properties>
</propertiesPolicy>
</rtps>
</participant>
</profiles>
- 实际应用场景 场景 1:带宽受限的物联网设备 cpp Copy // 嵌入式设备仅发送数据,不接收类型 DomainParticipantQos pqos; pqos.properties().properties().emplace_back( "fastdds.type_propagation", "registration_only");
// 节省带宽:不处理接收的类型信息
// 但允许其他参与者发现本设备的类型
场景 2:异构系统类型不兼容
cpp
Copy
// 系统 A 使用旧版 IDL,系统 B 使用新版 IDL
// 禁用类型传播,使用静态类型配置
DomainParticipantQos pqos;
pqos.properties().properties().emplace_back(
"fastdds.type_propagation",
"disabled");
// 手动加载 TypeObject 到 Registry
eprosima::fastdds::dds::TypeObjectRegistry::get_instance()->register_type_object(
"MyType", &type_object);
场景 3:多机器人系统
cpp
Copy
// 机器人集群,类型相似但非完全相同
// 使用 minimal_bandwidth 减少发现流量
DomainParticipantQos pqos;
pqos.properties().properties().emplace_back(
"fastdds.type_propagation",
"minimal_bandwidth");
// 仅在需要时通过 TypeLookup 获取完整类型
- 性能影响
Table
Copy
模式 发现阶段带宽 运行时延迟 功能完整性
disabled 最低 最低 受限(无动态类型)
enabled 最高 中等 完整
minimal_bandwidth 中等 较高(首次 TypeLookup) 完整
registration_only 中等 最低 单向类型传播
选择建议:
默认使用 enabled:开发和标准部署场景
嵌入式设备使用 disabled 或 registration_only:节省资源
大规模集群使用 minimal_bandwidth:减少网络负载
- 与 TypeLookup Service 的关系
fastdds.type_propagation 直接影响 TypeLookup Service 的行为:
enabled:TypeLookup Service 启用,可响应远程请求
minimal_bandwidth:TypeLookup Service 启用,按需提供完整类型
registration_only:TypeLookup Service 禁用,不响应请求
disabled:TypeLookup Service 禁用,完全不处理类型信息
注意:如果 fastdds.type_propagation 设置为 disabled,客户端无法获取未知类型的动态定义,可能导致匹配失败。
- 调试技巧
检查当前 DomainParticipant 的类型传播模式:
cpp
Copy
DomainParticipant* participant = ...;
DomainParticipantQos pqos;
participant->get_qos(pqos);
// 查找属性
for (const auto& prop : pqos.properties().properties()) {
if (prop.name() == "fastdds.type_propagation") {
std::cout << "Type propagation mode: " << prop.value() << std::endl;
break;
}
}
通过 Wireshark 抓包查看 EDP 消息大小:
enabled:EDP 消息较大,包含完整类型信息
minimal_bandwidth:EDP 消息较小,仅包含 MINIMAL 类型
disabled:EDP 消息最小,无类型信息
总结
fastdds.type_propagation 是 Fast DDS 中控制类型发现机制的关键属性,提供了从完全禁用到完全启用的灵活选择。理解各模式的区别和适用场景,可以显著优化 DDS 系统的带宽使用和发现性能。