ZBLOG

3.1.2.1.7. HistoryQosPolicy This QoS Policy controls the behavior of the system when the value of an instance changes one or more times before it can be successfully communicated to the existing DataReader entities. List of QoS Policy data membe...

HistoryQosPolicy 解释

HistoryQosPolicy 是一种 QoS(服务质量)策略,用于控制系统在实例值发生变化时的行为,尤其是在这些变化无法及时传达给现有的 DataReader 实体时。该策略对 Topic、DataWriter 和 DataReader 实体都适用,但一旦实体启用后,该策略将不可更改。

QoS 策略数据成员:

  1. kind: HistoryQosPolicyKind

    • 控制服务是仅交付最近的值,还是保留所有中间值,或者采取其他方式。具体行为取决于 HistoryQosPolicyKind 的定义。
  2. depth: int32_t

    • 确定需要在历史记录中保留的样本最大数量。只有当 kind 设置为 KEEP_LAST_HISTORY_QOS 时,才会考虑该设置。同时,它必须与 ResourceLimitsQosPolicy 一致,即其值必须小于或等于每个实例的最大样本数 (max_samples_per_instance)。

HistoryQosPolicyKind

有两种可能的取值:

  1. KEEP_LAST_HISTORY_QOS:

    • 服务只会尝试保持实例的最新值并丢弃旧值。最大保持和交付的样本数量由 depth 定义。如果达到深度限制,则系统会丢弃最旧的样本以腾出空间。
  2. 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() 调用将在历史记录中有空间之前被阻塞。

示例代码

  1. // 此示例使用 DataWriter,但同样适用于 DataReader 和 Topic 实体
  2. DataWriterQos writer_qos;
  3. // 默认情况下,HistoryQosPolicy 被构造为 kind = KEEP_LAST 和 depth = 1
  4. // 可以调整深度,同时保持 kind 为 KEEP_LAST
  5. writer_qos.history().depth = 20;
  6. // 或者可以将 kind 更改为 KEEP_ALL(depth 不会被使用)。
  7. writer_qos.history().kind = KEEP_ALL_HISTORY_QOS;
  8. // 使用修改后的 QoS 创建对应实体
  9. writer_ = publisher_->create_datawriter(topic_, writer_qos);

总结

通过配置 HistoryQosPolicy,开发者可以控制数据流中的历史信息管理,从而影响到消息如何存储和发送。这对于实时系统特别重要,因为它允许开发人员优化性能并确保有效的数据传输。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=22500

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?