HistoryQosPolicy 解释
HistoryQosPolicy
是一种 QoS(服务质量)策略,用于控制系统在实例值发生变化时的行为,尤其是在这些变化无法及时传达给现有的 DataReader 实体时。该策略对 Topic、DataWriter 和 DataReader 实体都适用,但一旦实体启用后,该策略将不可更改。
QoS 策略数据成员:
kind:
HistoryQosPolicyKind
- 控制服务是仅交付最近的值,还是保留所有中间值,或者采取其他方式。具体行为取决于
HistoryQosPolicyKind
的定义。
- 控制服务是仅交付最近的值,还是保留所有中间值,或者采取其他方式。具体行为取决于
depth:
int32_t
- 确定需要在历史记录中保留的样本最大数量。只有当
kind
设置为KEEP_LAST_HISTORY_QOS
时,才会考虑该设置。同时,它必须与ResourceLimitsQosPolicy
一致,即其值必须小于或等于每个实例的最大样本数 (max_samples_per_instance
)。
- 确定需要在历史记录中保留的样本最大数量。只有当
HistoryQosPolicyKind
有两种可能的取值:
KEEP_LAST_HISTORY_QOS:
- 服务只会尝试保持实例的最新值并丢弃旧值。最大保持和交付的样本数量由
depth
定义。如果达到深度限制,则系统会丢弃最旧的样本以腾出空间。
- 服务只会尝试保持实例的最新值并丢弃旧值。最大保持和交付的样本数量由
KEEP_ALL_HISTORY_QOS:
- 服务会尽量保留所有实例的值,直到它们能够交付给所有现有订阅者。如果选择此选项,则
depth
将没有任何效果,因此历史记录仅受ResourceLimitsQosPolicy
中设定的值限制。
- 服务会尽量保留所有实例的值,直到它们能够交付给所有现有订阅者。如果选择此选项,则
一致性规则
必须根据 ResourceLimitsQosPolicy 一致设置 HistoryQos,并且还需考虑其他 QoS,如 DurabilityQosPolicy 和 ReliabilityQosPolicy,因此需要考虑多个场景:
- 如果 kind 设置为 KEEP_LAST_HISTORY_QOS,仅在这种情况下考虑 depth。
- depth 必须与 ResourceLimitsQosPolicy 的设置一致,即 depth 必须小于或等于 max_samples_per_instance,并且 max_samples 必须大于等于 max_samples_per_instance 与 max_instances 的乘积。
- depth 不能小于或等于零;如果需要无限深度,请考虑将 kind 设置为 KEEP_ALL_HISTORY_QOS。
在 ReliabilityQosPolicyKind 设置为 RELIABLE_RELIABILITY_QOS 且 HistoryQosPolicy kind 设置为 KEEP_ALL_HISTORY_QOS 的情况下,当资源限制被达到时,服务行为依赖 DurabilityQosPolicy:
- 如果 DurabilityQosPolicy kind 配置为 VOLATILE_DURABILITY_QOS,则 DataWriter 的 write() 调用将丢弃历史中最旧的样本。
- 如果 DurabilityQosPolicy kind 配置为 TRANSIENT_LOCAL_DURABILITY_QOS 或 TRANSIENT_DURABILITY_QOS,则 DataWriter 的 write() 调用将在历史记录中有空间之前被阻塞。
示例代码
// 此示例使用 DataWriter,但同样适用于 DataReader 和 Topic 实体
DataWriterQos writer_qos;
// 默认情况下,HistoryQosPolicy 被构造为 kind = KEEP_LAST 和 depth = 1
// 可以调整深度,同时保持 kind 为 KEEP_LAST
writer_qos.history().depth = 20;
// 或者可以将 kind 更改为 KEEP_ALL(depth 不会被使用)。
writer_qos.history().kind = KEEP_ALL_HISTORY_QOS;
// 使用修改后的 QoS 创建对应实体
writer_ = publisher_->create_datawriter(topic_, writer_qos);
总结
通过配置 HistoryQosPolicy
,开发者可以控制数据流中的历史信息管理,从而影响到消息如何存储和发送。这对于实时系统特别重要,因为它允许开发人员优化性能并确保有效的数据传输。
内容由零声教学AI助手提供,问题来源于学员提问