1. Best-effort Delivery Model
默认情况下,Connext 使用尽力而为的交付模型:无需花费任何精力来确保按顺序交付或重新发送丢失的 DDS 样本。尽力而为的 DataReader 会忽略丢失的 DDS 样本,而选择最新的 DDS 样本。仅当您的应用程序在特定时间段(在 47.7 DEADLINE QosPolicy 中设置)内未收到新的 DDS 样本时,才会收到通知。
尽力而为交付模型最适合连续发送的时间关键型信息。例如,考虑 DataWriter 传感器设备的值(例如水箱内的压力),并假设 DataWriter 连续发送 DDS 样本。在这种情况下,本主题的 DataReader 只对提供最新的压力读数感兴趣 — 较旧的 DDS 样品已过时。
2.Reliable Delivery Model
可靠的交付意味着 DDS 样品可以保证按照公布的顺序到达。
DataWriter 维护一个发送队列,该队列有空间来保存最后发送的 X 个 DDS 样本。同样,DataReader 维护一个接收队列,其中包含用于连续 X 个预期 DDS 样本的空间。
发送和接收队列用于临时缓存 DDS 样本,直到 Connext 确定 DDS 样本已送达且不再需要。Connext 在所有可靠订阅确认 DDS 样本后,从发布的发送队列中删除 DDS 样本。禁用肯定确认时(请参阅 QosPolicy DATA_WRITER_PROTOCOL 47.5(DDS 扩展)和 QosPolicy DATA_READER_PROTOCOL 48.1(DDS 扩展)),DDS 样本将在相应的保持持续时间过后从发送队列中删除(请参阅表 47.14 DDS_RtpsReliableWriterProtocol_t)。
如果到达无序的 DDS 样本,Connext 会推测性地将其缓存在 DataReader 的接收队列中(前提是队列中有空间)。只有连续的 DDS 样本才会传递到 DataReader。
可以将 DataWriter 设置为在发送 DDS 样本时等待可用的队列空间。这将导致发送线程阻塞,直到发送队列中有空间为止。(或者,您可以决定牺牲可靠地发送 DDS 样本,以便不会影响发送速率。如果 DataWriter 设置为忽略整个队列并仍然发送,则较旧的缓存 DDS 样本将在所有 DataReader 收到它们之前被推出队列。在这种情况下,DataReader(或其订阅服务器)会通过其 Listener 和/或 Conditions 收到缺少 DDS 样本的通知。
Connext 会根据需要自动发送确认 (ACKNACK) 以保持可靠的通信。DataWriter 可以选择在指定的持续时间内阻塞以等待这些确认(请参阅 31.11 在 DataWriter 中等待确认)。
Connext 在匹配的 DataWriter 和所有 DataReader 之间建立一个虚拟的可靠通道。此机制将 DataReader 彼此隔离,允许应用程序控制内存使用,并为 DataWriter 提供平衡可靠性和确定性的机制。此外,使用发送和接收队列可以有效地实现 Connext,而不会在流中引入不必要的延迟。
请注意,write() 的成功返回代码 (DDS_RETCODE_OK) 并不一定意味着所有 DataReader 都已收到数据。这仅表示 DDS 示例已添加到 DataWriter 的队列中。要查看是否所有 DataReader 都已收到数据,请查看 31.6.8 RELIABLE_WRITER_CACHE_CHANGED状态(DDS 扩展)以查看是否有任何 DDS 样本未确认。
假设 DataWriter A 可靠地发布 DataReaderB 和 C 可靠地订阅的主题。B 的队列中有空格,但 C 没有。DataWriter A 会收到通知吗?DataReader C 是否会收到任何错误消息或回调?确切的行为取决于 QoS 设置:
3.Overview of the Reliable Protocol
Connext 的一个重要优势是,它可以在非常广泛的传输之上提供 DDS 要求的可靠性和其他 QoS 保证,包括基于数据包的传输、不可靠的网络、支持多播的传输、突发或高延迟传输等。Connext 还能够保持活跃度和应用程序级 QoS,即使在传输层存在零星连接丢失的情况下, 这是移动网络中的一个重要优势。Connext 通过实施一个可靠的协议来实现这一点,该协议对应用程序级消息进行排序和确认,并监控链接的活跃度。这称为实时发布-订阅 (RTPS) 协议;它是一个开放的国际标准。1
为了在如此广泛的环境中工作,RTPS 定义的可靠协议是高度可配置的,其中包含一组参数,这些参数允许应用程序微调其行为,以权衡延迟、响应能力、活跃度、吞吐量和资源利用率。本节在了解配置参数如何影响其操作所需的范围内描述了最重要的功能。
RTPS 协议最重要的功能是:
为了支持这些功能,RTPS 使用多种类型的消息:数据消息 (DATA)、确认 (ACKNACK) 和检测信号 (HB)。
请务必注意,Connext 可以将上述多条消息捆绑到单个网络数据包中。这种“子消息捆绑”提供了更高性能的通信。
还值得注意的是,由于 HB 和 ACKNACK 消息传达单个写入器和读取器对之间的可靠通信状态,因此 Connext 至少需要一个单播目标,以便可以将这些消息发送到正确的目标,而不是通过多播目标广播。Connext 支持使用 44.10 WIRE_PROTOCOL QosPolicy(DDS 扩展)中的 enable_multicast_periodic_heartbeat 启用向多播目标发送定期检测信号。