on_unacknowledged_sample_removed()
是一个非标准的回调,用于通知用户某个样本在未被已匹配的 DataReaders 发送或接收之前就被移除。这种情况可能发生在网络受限或发布吞吐量过高的情况下。该回调可以用于检测这些问题,以便发布应用能够采取解决方案,比如降低发布速率。
移除未确认样本的条件
移除未确认样本的判断标准取决于 ReliabilityQosPolicy
的配置:
BEST_EFFORT_RELIABILITY_QOS:
- 在这种可靠性策略下,DataWriters 会通知用户当样本在未被确认时已被移除,只要该样本尚未通过传输层发送。
- 作用:这种方式相对简单,因为只需关注是否有样本发送。
RELIABLE_RELIABILITY_QOS:
- 对于使用此可靠性策略的 DataWriters,只有当所有已匹配的数据读取器都通过发送对应的元流 ACK 消息确认了接收后,该样本才会认为是安全地接收。如果某些 DataReaders 没有返回 ACK,则视为未被确认,而该样本将被标记为已移除。
- 由于存在竞态条件,在样本被删除时某些匹配的数据读取器可能已经收到该样本,但尚未发送 ACK。这意味着虽然某些数据读取器成功接收了该样本,但因为至少有一个读取器没有 ACK,所以仍然会触发未确认删除通知。在这种情况下,虽然可能会出现误报,但从用户的角度来看,知道哪些样本没有得到每个匹配数据读取器的确认更具意义。
DisablePositiveACKsQosPolicy:
- 对于启用了此策略的可靠 DataWriters,将禁用正 ACK 消息的发送。只有在样本丢失时,匹配的数据读取器才会通过负 NACK 消息通知丢失情况。如果在 QoS 策略定义的时间内没有收到 NACK,则认为该样本已经接收。
- 此情形同样容易引发竞态条件,因为 NACK 消息可能正在传输中或者在网络中丢失。因此,对于不将收到 ACK 的可靠 DataWriter,将采用与最佳努力策略相同的方法来判断。
小结
这个回调提供了一种监测机制,可以帮助开发者了解数据流中的潜在问题,并允许他们主动调整发布速率或其他参数以应对网络限制或性能瓶颈。正确理解不同 QoS 策略如何影响到这一机制对于优化系统性能至关重要。
内容由零声教学AI助手提供,问题来源于学员提问