Opensplice QoS(Quality of Service)

Opensplice QoS

Opensplice提供一系列的服务策略来控制非功能操作,比如:数据可用性(data availability)、数据传递(data delivery)、数据及时性(data timeliness)以及资源的实用情况(resource usage)等等。图1列出了所有的服务。

                                                                                                          图1 Opensplice QoS

 诸如topic、data reader、data writer这些实体都是通过QoS策略来控制的。端到端的QoS策略可以看做是匹配的一部分。

Opensplice采用“请求(request) vs. 供应(offer)”的QoS匹配方式,如图2所示。当且仅当它对给定主题请求的QoS不超过数据写入器产生数据的QoS(最严格的匹配方式)时,数据读取器匹配数据写入器。

                           图2 OpenSplice Request vs. Offer QoS Model

 Opensplice的订阅是通过writer与reader的topic的类型和名称相匹配得到的,或者是QoS的request与offer相匹配得到的。匹配的规则为:

-> topic类型匹配,端到端都保留了类型;

-> 端到端的QoS不变量也被保留。

1. 数据可用性服务(Data availability)

Opensplice为域的参与者提供了一些数据可用行服务,包括如下:

-> DURABILITY 策略控制了数据写入域(domain)中的GDS(global data space)的生命周期。分为如下几个级别:

---> VOLATILE:数据一旦publish,Opensplice不会维护到接下来加入的应用(subscribe);

---> TRANSIENT_LOCAL:如果publisher还存在,为了接下来的subscriber得到最新发布的数据,TRANSIENT_LOCAL服务保证publisher需要将数据存储在本地;

---> TRANSIENT:对于接下来加入的subscribers,TRANSIENT保证GDS维护的信息在所有的publisher之外。

---> PERSISTENT:即使在系统关闭并重启之后,PERSISTENT服务保证GDS存储的信息永远存在并对接下来的subscribers可用。

DURABILITY 策略通过DURABILITY_SERVICE QoS实现。

-> LIFESPAN QoS:这个服务控制着数据样本有效的时间间隔。默认值为infinite,infinite的代替值可以认为是时间跨度内数据有效;

-> HISTORY QoS:控制着必须为reader或writer存储的样本(data sample)的数量。可能的值是最后的1个样本,或者最后n个样本,或者是全部样本。

数据可用性服务在在时间与空间上是可以分开的。这个服务同样可以适配不断加入的reader与writer。

 

2. 数据传输服务(Data delivery)

OpenSplice的数据传输服务控制着数据传输方式以及publisher声明数据更新方式:

-> PRESENTATION QoS:控制着想subscriber提供信息变更的方式。此QoS可控制数据更新的排序和一致性。应用范围由访问范围定义,访问范围可以是INSTANCE,TOPIC或GROUP级别之一。

-> RELIABILITY QoS:控制与数据扩散相关的可靠性级别。可能的选择是RELIABLE和BEST_EFFORT分配。

-> PARTITION QoS:控制DDS分区(由字符串名称表示)与publisher/subscriber的特定instance之间的关联。该关联为DDS实现提供了抽象,允许隔离不同分区生成的流量,从而提高整体系统的可扩展性和性能。

-> DESTINATION_ORDER QoS:控制publisher对给定topic的某个instance所做的更改的顺序。 DDS允许根据源或目标时间戳排序不同的更改。

-> OWNERSHIP QoS:控制哪个writer拥有topic的访问权,当有多个writers要求访问topic,且topic是EXCLUSIVE(独占)。仅仅拥有最高OWNERSHIP_STRENGTH(拥有权)的writer可以publish数据。如果OWNERSHIP QoS是共享的那么可以由多个writer访问topic,因此有助于管理相同数据的复制发布者。

这些DDS数据传输服务控制数据的可靠性和可用性,从而允许在正确的时间将正确的数据传送到正确的位置。

 

3. 数据及时性服务(Data timeliness)

Opensplice提供以下服务来控制分布式数据的及时性属性:

-> DEADLINE QoS:可以定义的最大到达时间值。当任务错过最大时间到达值,Opensplice可以配置通知任务已经错过。

-> LATENCY_BUDGET QoS:可以为任务提供了一种通知Opensplice传输数据相关的紧急程度的方法。这个服务指定DDS必须分发信息的时间段。此时间段从publisher写入数据的那一刻开始,直到subscriber的数据缓存中可用,以供读者使用。

-> TRANSPORT_PRIORITY QoS:允许任务控制topic或者topic instance的重要程度,从而允许处理任务优先处理相对重要的topic。

 

4. 资源(Resources)

OpenSplice定义了以下QoS策略来控制满足数据传播要求所必需的网络和计算资源:

-> TIME_BASED_FILTER QoS:允许应用程序指定数据样本之间的最小到达间隔时间,从而表示它们的最大传输速率。此策略有助于OpenSplice通过有限带宽网络连接或计算能力有限的subscriber优化网络带宽,内存和处理能力。

-> RESOURCE_LIMITS QoS:允许任务控制最大可用存储空间来保存topic instance和相关数量的历史data samples。

 

5. 组态(Configuration)

上述服务对数据传递,可用性,及时性和资源使用提供最重要方面的控制。Opensplice还支持定义和分发用户指定的引导信息,如下:

-> USER_DATA QoS:允许任务将一系列octets与域参与者,数据读取器和数据写入器相关联。数据通过固有的topic分发。这个服务经常用于分发安全证书。

-> TOPIC_DATA QoS:允许任务将octets与主题相关联。该引导信息通过固有topic分发。此服务的一个常见用途是使用附加信息或元信息扩展主题,比如DL类型代码或XML。

-> GROUP_DATA QoS:允许任务将octets与发布者和订阅者相关联。该引导信息通过固有topic分发。此信息的典型用法是允许对订阅匹配进行额外的应用程序控制。

 

6. 设置QoS

前面涉及的所有代码都是用的是默认QoS设置,这样我们就不必关心定义所需的QoS。下面的代码讲述了怎样创建与设置QoS:

// 在Opensplice中设置QoS
dds::domain::DomainParticipant dp(-1);
dds::topic::qos::TopicQos topicQos = dp.default_topic_qos()
        << dds::core::policy::Durability::Transient()    // 保证当前Topic的信息保存在所有publisher之外,且在接下来的是可用的。
        << dds::core::policy::Reliability::Reliable();   // 保证当前Topic信息传递的可靠性级别。

dds::topic::Topic<DataScope::DataScopeType> topic(dp, "TempSensor", topicQos);

dds::pub::qos::PublisherQos pubQos = dp.default_publisher_qos()
        << dds::core::policy::Partition("building-1:floor-2:room:3");

dds::pub::Publisher pub(dp, pubQos);

dds::pub::qos::DataWriterQos dwqos = topic.qos();
dds::core::policy::TransportPriority transportPriority(10);
dwqos << transportPriority;

dds::pub::DataWriter<tutorial::TempSensorType> dw(pub, topic, dwqos);    

除了明确创建QoS的API之外,DDS还提供了QoSProvider的概念,以便可以外部化QoS的定义并使其成为部署时间问题。 下面的列表显示了QoSProvider如何用于从文件中获取QoS定义。

dds::core::QosProvider qp("file://defaults.xml", "DDS DefaultQosProfile");

// create a Domain Participant, -1 defaults to value defined in configuration file
dds::domain::DomainParticipant dp(-1);

dds::topic::qos::TopicQos topicQos = qp.topic_qos();

dds::topic::Topic<tutorial::TempSensorType> topic(dp, "TempSensor", topicQos);

dds::pub::qos::PublisherQos pubQos = qp.publisher_qos();
dds::pub::Publisher pub(dp, pubQos);

dds::pub::qos::DataWriterQos dwqos = qp.datawriter_qos();
dds::pub::DataWriter<tutorial::TempSensorType> dw(pub, topic, dwqos);

 

原创博文,转载请标明出处。

posted on 2020-04-25 11:48  LeonHuo  阅读(880)  评论(0编辑  收藏  举报

导航