zoukankan      html  css  js  c++  java
  • 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);

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

  • 相关阅读:
    剑指offer5-用两个栈实现队列
    剑指offer4-重建二叉树
    剑指offer3-从尾到头打印链表
    MATLAB曲线拟合函数
    贪心算法训练(九)——Best Cow Line(字典序最小问题)
    贪心算法训练(八)——智力大冲浪(带期限和罚款的单位时间调度问题)
    贪心算法训练(七)——加工生产调度(流水作业调度问题)
    贪心算法训练(六)——喷水装置(区间覆盖问题)
    贪心算法训练(五)——种树(区间选点问题)
    贪心算法训练(四)——(HDU1050)Moving Tables
  • 原文地址:https://www.cnblogs.com/hgl0417/p/12772222.html
Copyright © 2011-2022 走看看