DDS之QOS
文章目录
QOS可以理解为数据提供者和接收者之间的合约
1、概述
每个策略都定义了自己的结构,每个实体都支持策略的一个子集,并且定义了一个由被支持的策略结构体所组成的 QoS 结构体,一个给定实体的可用策略集不会受到 QoS 结构体中包含的策略结构体的限制
2、基本功能与类别
Qos:Qos 基本上负责了 DDS 的所有配置,无论是心跳,消息可靠性,流量控制,还是安全配置,甚至包括通道配置,全是通过 Qos 来实现的。
RxO:
YES—Topic的发布方和订阅方必须设置互相兼容的QoS策略,否则不能建立通信
NO—Topc的发布方和订阅方可以分别设置此策略,任何策略的组合都是兼容的
N/A—只能在Topc的发布方或订阅方其中一方设置此策略,不能同时设置,所以不存在兼容问题
Changeable:运行时是否能够改变此策略
2.1、Data availability(数据可用性)
DDS提供以下QoS策略以实现数据可用性控制:
1、 DURABILITY
- VOLATILE:数据仅提供给现有的订阅者,后加入的Subscriber无法获得数据,这是DDS的默认行为
- TRANSIENT LOCAL:Publisher在本地保存数据,后加入的Subscriber能够获得数据
- TRANSIENT:GDS(Global Data Space)保存数据,后加入的Subscriber能够获得数据
- PERSISTENT:GDS永久保存数据,后加入的Subscriber能够获得数据,即使整个系统发生了重启
比如:一个dds系统,里面有多个Subscriber,我们有些节点先启动,有些后启动,启动慢的节点可能错够一些数据。可以配置durability进行解决。
2、 LIFESPAN:Data sample的有效时间,默认为永久
比如:类似雷达等数据是随着时间快速变化的,如果出现故障一直是旧的数据,我们可以设置LIFESPAN来设置数据有效时间。
3、 HISTORY:保存data sample历史记录的个数,可以选择仅保存最新sample,或最近的N个sample,
或全部sample
比如:车速数据我们想比较车速变化,那么保留一些历史数据,就可以简单知道是加速还是减速。
2.2、Data delivery(数据交付)
DDS提供以下QoS策略来控制数据的交付方式:
1、PRESENTATION
- Coherent Access
在一组DDS data sample的更新都到达接收端后,应用程序才能够访问这一组data sample, 适用于不同数据实例之间存在关联关系的场景
比如:坐标数据,x,y,z都获取到才能访问这组数据。
- Ordered Access
保留Data sample之间的顺序
2、RELIABILITY
- RELIABLE:可靠送达(传输层如果不可靠,应用层实现,比较消耗资源,容易堵塞)
- BEST EFFORT:尽力送达
3、PARTITION
允许在同一Domain下创建逻辑分区,处于同一分区内的DataWriter和DataReader才可以建立通信
4、DESTINATION ORDER
当系统中存在针对同一个数据实例的多个DataReaders时,接收端如何访问数据
BY RECEPTION TIMESTAMP:以接收端最后收到的数据为准
BY SOURCE TIMESTAMP:以发送端最后发送的数据为准
5、OWNERSHIP
当系统中存在针对同一个数据实例的多个DataWriter时,可以通过设置每个DataWriter的“强度”来控制DataWriter的写入权限(“强度”最高的DataWriter拥有写入权限)
比如:有两套传感器(冗余)只使用一个,一个发生故障(高强度),切换到另一个传感器(次强度)。
2.3、Data timeliness(数据时效性)
DDS提供以下QoS策略来控制分布式数据的时效性:
1、DEADLINE
用于约束数据的发送周期
对发送端来说,设置DEADLINE意味着应用程序必须以在给定时间周期内写入数据
对接收端来说,设置DEADLINE是对数据的时效性的最小要求
保证接收者的deadline>=发送者的deadline,否则产生不兼容错误。
2、LATENCY BUDGET
用于控制数据传输的延迟。
它定义了数据从发送端到接收端的最大允许延迟时间。当数据的延迟超过设定的延迟预算时,DDS可以采取一些策略,如丢弃数据或调整传输优先级,以确保数据传输的实时性
3、TRANSPORT PRIORITY
控制传输数据的优先级,由一个整数表示,值越大优先级越高
2.4、Resources(计算资源)
DDS定义了以下QoS策略来控制满足数据分发要求所必需的网络和计算资源:
1、TIME BASED FILTER
设置该参数意味着在指定时间周期内只期望收到一个data sample,过多的data sample将被DataReader丢弃
该参数有助于优化网络负载及节点的计算资源
比如:默认情况发送方能发送得很快(1秒100个),接受方只要求1秒5个,就可以设置这个参数控制发送速度,减小本地系统资源。
2、RESOURCE LIMITS
用于限制DDS可以分配的系统内存
2.5、过滤器类
1、 Time-Based Filter(基于时间的过滤器):基于时间戳进行数据过滤,只传输满足指定时间条件的数据。
2、 Lifespan-based Filter(基于生命周期的过滤器):基于数据的生命周期进行过滤,只传输满足指定生命周期条件的数据。
3、 Topic-based Filter(基于主题的过滤器):基于主题进行数据过滤,只传输满足指定主题条件的数据。
2.6、Configuration(用户定义用途)
DDS支持通过以下QoS策略来定义和分发用户信息:
1、USER DATA
允许应用程序将一个字节序列与DomainParticipant、DataReader或DataWriter进行关联,该字节序列通过内建Topic进行分发
常用于分发安全凭证,应用程序可通过此凭证验证数据的有效性
2、TOPIC DATA
允许应用程序将一个字节序列与Topic相关联,该字节序列通过内建Topic进行分发
常用于为Topic添加附加信息
3、GROUP DATA
允许应用程序将一个字节序列与Publisher或Subscriber相关联,该字节序列通过内建Topic进行分发
可以携带用户定义的信息,在服务发现的过程中就可以交换一些用户数据,从而做一些想做的事,比如安全凭证啥的
2.7、其他类
1、活跃性(Liveliness)
- 心跳发送周期(Liveliness Lease Duration):指定数据发布者发送心跳信号的时间间隔。数据订阅者(DataReader)通过接收心跳信号来判断数据发布者是否仍然活跃。如果在指定的时间间隔内没有收到心跳信号,订阅者将认为数据发布者已经失活。
- 心跳超时时间(Liveliness Lease Duration):指定数据订阅者等待心跳信号的超时时间。如果在超时时间内没有收到心跳信号,订阅者将认为数据发布者已经失活,并采取相应的措施,如清除相关数据。
2、EntityFactory:指定充当工厂的实体是否自动启用它创建的实例。
3、设置Qos
设置一个策略就像获得一个已经有默认值的结构体一样简单,并在必要的时候修改个别策略值,然后将 QoS 结构体应用到实体中(通常是在实体被建立的时候)。
应用程序可以通过调用 set_qos() 操作来改变任意实体的 QoS 策略。如果该 QoS 策略变得不再兼容,则现有的连接将会移除,否则,如果该 Qos 策略变得兼容了,将会有新的连接添加。该改变将会通过相应的实体调用 QoS 更新操作通知 DCPSInfoRepo,DCPSInfoRepo 将会依据 Qos 策略规范来重新检测兼容性和关联性,如果兼容性检测失败,set_qos() 调用将会返回错误,关联性检测将以移除现有的连接或增加新的连接为结果。
如果试图去改变一个不能改变的 QoS 策略,set_qos() 操作将会返回 DDS::RETCODE_IMMUTABLE_POLICY。
应用程序获取实体的默认 QoS 策略,通过实例化该实体的一个对应的 Qos 结构体,然后调用实体工厂的 get_default_entity_qos() 操作将它获取回来(例如,对于发布者和订阅者,可以通过使用域参与者来获取默认 QoS)。
4、补充知识
尽量发送和可靠发送。
在舰载信息系统中,尽量发送通常为默认方式,这种方式无需确定样本是否按顺序传递也不需要重新发送样本,而当对数据样本正确性要求较高时,这种方式并不再适用,此时需使用可靠发送模式。可靠发送模式确保所有的样本都被有序接收。
可靠发送模型:
可靠发送意味着样本确定到达并且按序发布。发送和接收队列用来临时缓存样本,直到DDS确认样本已经成功传递。在样本已经被所有可靠的订阅者接收之后,DDS将发布队列中的样本移除。如果无序样本到达,那么DDS将其缓存到数据读取者(DR)的接收队列中。
在发送样本时,数据写入者(DW)设置为等待空间状态,即当发送队列没有可用的空间时,DW一直等待直到有可用的队列空间。而如果将DW设置为非等待空间状态,即不论队列溢出与否都一直发送数据,那么旧的缓存样本将会被推出队列,DR将无法接收。
可靠协议:
为了保证可靠发送,DDS执行实时发布订阅(Real-Time Publish-Subscribe,RTPS)协议。
可靠协议使用以下几种类型的消息[3]:数据信息(Data)、心跳检测信息(HB)、反馈信息(ACK/NACK)。
(1)数据信息。格式为DATA(<样本值>,<序列号>),例如DATA(A,1),表示样本值为A,序列号为1。
(2)心跳检测信息。HB信息通知DR应该接收了某序列号范围内的信息,要求DR发送相应的响应信息。
(3)反馈信息。反馈信息用于向DW表明特定的信息已经成功存储到该DR的历史中。DW可以通过反馈信息得知DR哪些信息丢失了。
丢包状况下的可靠协议
假设样本DATA(A,1)在发送过程中发生了丢包情况,当DR收到下一个信号包(DATA(B,2);HB(1-2))时,由于心跳检测HB(1-2)表明DR应该已经收到序列号为1-2的样本,于是DR将会自检是否已经成功接收这些样本,会发现序列号为1的样本并没有被成功接收。此时,DR将会发送ACKNACK(1)给DW,要求其重新发送样本DATA(A,1)。该过程如图2所示。
正常状况下的可靠协议
在样本未丢失的情况下,当调用写函数(write())时,可靠协议工作流程如图1所示。
在样本被发送之前,将会在DW的发送序列中加上序列号(此例中为1)。一旦样本被DR接收,DR就将信息存放于其接收队列中,标记为√。DR接收到的心跳检测信号HB(1)为确认自己是否已经成功接收样本(1,A),本例中为成功接收。DW接收到DR发的ACKNACK(2)信息后,确认样本(1,A)已经被成功接收,也以√标记。