RTPS发布订阅一条消息流程
发布相关的源代码文件:PublisherImpl.cpp Publisher.cpp RTPSWriter.cpp WriterHistory.cpp
PublisherHistory.cpp
调用流程:
Publisher.cpp Publisher::write()
PublisherImpl.cpp create_new_change()
create_new_change_with_params()
create_new_change_with_params()
RTPSWriter.cpp new_change()
TypeSupport_impl.cpp serialize()
PublisherHistory.cpp add_pub_change()
WriterHistory.cpp add_change_()
创建订阅者源代码文件:Domain.cpp ParticipantImpl.cpp SubscriberImpl.cpp Subscriber.cpp RTPSDomain.cpp RTPSParticipant.cpp RTPSReader.cpp
创建订阅的相关源代码包括:SubscriberImpl.cpp Subscriber.cpp SubscriberHistory.cpp RTPSReader.cpp ReaderHistory.cpp
Heartbeat和AckNack
心跳报文:从写端点发送到读端点,表示写断点是可访问的;
确认:从读端点发送到写端点,向写端点报告读端点是否正确接收信息,包括确认和非确认两种
通过这两条特殊信息,可确保信息交互的可靠性,从而判断信息是否丢失或需要发送,可通过PublisherAttributes设置心跳报文的频率,提高心跳报文频率会产生大量的信息被发出,但会加快系统对数据丢失的响应
服务发现数据:
这种数据用于发现过程,使得域参与者(DomainParticipants)、数据写入者(DataWriters)和数据读取者(DataReaders)能够找到并相互通信。
发现过程包含两个主要阶段:参与者发现和端点发现。
参与者发现:此阶段利用参与者的DATA消息来通告域参与者在网络中的存在。这些消息包括像域参与者的唯一标识符、传输定位器以及服务质量(QoS)设置之类的信息。此阶段采用尽力而为的通信方式。
端点发现:此阶段涉及到发布和订阅DATA消息的交换,以通知数据写入者和数据读取者的情况。此阶段采用可靠通信以确保所有端点彼此了解并且能够有效地通信。
发现数据由为每个域参与者自动创建的内置数据写入者和数据读取者来管理。
用户数据:
是指通过用户创建的数据写入者和数据读取者发送和接收的实际应用程序数据。
这些数据与特定的主题(Topics)相关联,并受应用程序所定义的服务质量(QoS)策略约束。
用户数据是应用程序最关心的部分,因为它代表了系统各部分之间交换的信息。
总结来说,服务发现数据用于建立和维持参与者及端点之间的通信,而用户数据则是应用程序中实际被交换的内容。
在RTI Connext中,数据写入者的发送队列和数据读取者的接收队列在数据通信过程中扮演着至关重要的角色。以下是它们的区别和功能的概述:
数据写入者的发送队列
功能:
数据写入者的发送队列负责存储等待发送给一个或多个数据读取者的数据样本。当数据写入者生成数据的速度快于其可以通过网络发送的速度,或当网络遇到临时拥塞时,该队列尤为重要。
关键特性:
缓冲:发送队列缓冲数据样本以应对数据生成速率和网络状况的变化。
深度配置:发送队列的大小由历史服务质量(History QoS)策略中的深度设置决定。较大的深度允许更多的样本被缓冲,这有助于在网络波动期间防止数据丢失。
可靠性:如果可靠性QoS设置为可靠(RELIABLE),则发送队列确保样本在被数据读取者确认之前保留,必要时允许重传。
数据读取者的接收队列
功能:
数据读取者的接收队列存储从数据写入者接收到但尚未被应用程序处理的数据样本。该队列使数据读取者能够管理数据流,并确保以受控的方式将样本交付给应用程序。
关键特性:
缓冲:接收队列缓冲传入的样本以处理数据到达速率和应用程序处理速度的变化。
深度配置:类似于发送队列,接收队列的大小也由历史服务质量策略中的深度设置决定。较大的深度允许更多的样本被缓冲,这有助于在应用程序暂时无法处理传入数据时防止数据丢失。
顺序和过滤:接收队列还可以根据QoS策略管理样本的顺序并应用过滤,确保应用程序以期望的顺序和格式接收数据。
总结:
数据写入者的发送队列:管理传出的数据,即使在网络条件变化的情况下也能确保样本可靠且高效地发送。
数据读取者的接收队列:管理传入的数据,即使应用程序暂时无法处理它们,也能确保样本及时且受控地交付给应用程序。
两个队列对于保持数据流并在分布式系统中的数据写入者和数据读取者之间确保可靠的通信至关重要。