OpenDDS的Qos策略
目录
- 1、前言
- 2、QoS策略
- 2.1、LIVELINESS
- 2.2、RELIABILITY
- 2.3、HISTORY
- 2.4、DURABILITY
- 2.5、DURABILITY_SERVICE
- 2.6 、RESOURCE_LIMITS
- 2.7、PARTITION
- 2.8、DEADLINE
- 2.9、LIFESPAN
- 2.10、USER_DATA
- 2.11、TOPIC_DATA
- 2.12、GROUP_DATA
- 2.13、TRANSPORT_PRIORITY
- 2.14、LATENCY_BUDGET
- 2.15、ENTITY_FACTORY
- 2.16、PRESENTATION
- 2.17、DESTINATION_ORDER
- 2.18、WRITER_DATA_LIFECYCLE
- 2.19、READER_DATA_LIFECYCLE
- 2.20、TIME_BASED_FILTER
- 2.21、OWNERSHIP
- 2.22、OWNERSHIP_STRENGTH
1、前言
OpenDDS(Open Source Data Distribution Service)是一个功能强大的开源数据传输系统,广泛应用于分布式应用程序中。其中的 QoS(Quality of Service)策略在实现高效、可靠的数据通信方面起着关键作用。本文将深入探讨 OpenDDS 的 QoS 策略,包括其作用、常用策略类型以及如何配置和定制 QoS 策略。
2、QoS策略
在配置 OpenDDS 的 QoS 策略时,需要根据具体应用场景和需求选择合适的策略类型和参数。可以通过 XML 配置文件或代码中直接设置 QoS 策略,对各种数据发布器(DataWriter)和数据订阅器(DataReader)进行个性化的配置。
2.1、LIVELINESS
判断参与者是否存活。
心跳发送周期(Liveliness Lease Duration) : 指定数据发布者发送心跳信号的时间间隔。数据订阅者(DataReader)通过接收心跳信号来判断数据发布者是否仍然活跃。如果在指定的时间间隔内没有收到心跳信号,订阅者将认为数据发布者已经失活。
心跳超时时间(Liveliness Lease Duration): 指定数据订阅者等待心跳信号的超时时间,如果在超时时间内没有收到心跳信号,订阅者将认为数据发布者已经失活,并采取相应的措施,如清除相关数据。
enum LivelinessQosPolicyKind {AUTOMATIC_LIVELINESS_QOS,MANUAL_BY_PARTICIPANT_LIVELINESS_QOS,MANUAL_BY_TOPIC_LIVELINESS_QOS
};
struct LivelinessQosPolicy {LivelinessQosPolicyKind kind;Duration_t lease_duration;
};
2.2、RELIABILITY
为DataWriter设置RELIABILITY属性,可以使数据实现“可靠”的传输,当出现通信错误导致数据采样没有被接收到时,DataWriter会持续重传,直到所有数据被正确接收。
enum ReliabilityQosPolicyKind {BEST_EFFORT_RELIABILITY_QOS, //可靠送达 (传输层如果不可靠,应用层实现,比较消耗资源,容易堵塞)RELIABLE_RELIABILITY_QOS //尽力送达
};
struct ReliabilityQosPolicy {ReliabilityQosPolicyKind kind;Duration_t max_blocking_time;
};
2.3、HISTORY
可以选择仅保存最新sample,或最近的N个sample,或全部sample
设置HISTORY属性可以让DataWriter保存并发送旧的采样数据,新的DDS节点如果订阅了相关的Topic,它不仅能够接收到数据的当前值,也能收到一部分历史值,从而了解数据近期的变化趋势
enum HistoryQosPolicyKind {KEEP_LAST_HISTORY_QOS, // 保留最近一部分数据 新数据来临时丢掉最老的数据KEEP_ALL_HISTORY_QOS // 全部保留 到达资源限制字段后将不再接收
};
struct HistoryQosPolicy {HistoryQosPolicyKind kind;long depth; //保存数量 默认:1
};
2.4、DURABILITY
VOLATILE: 数据仅提供给现有的订阅者,后加入的Subscriber无法获得数据,这是DDS的默认行为
TRANSIENT_LOCAL: Publisher在本地保存数据,后加入的Subscriber能够获得数据TRANSIENT: GDS (Global Data Space) 保存数据,后加入的Subscriber能够获得数据PERSISTENT: GDS永久保存数据,后加入的Subscriber能够获得数据,即使整个系统发生了重启。
比如: 一个dds系统,里面有多个Subscriber,我们有些节点先启动,有些后启动,启动慢的节点可能错够一些数据。可以配置durabity进行解决。
enum DurabilityQosPolicyKind {VOLATILE_DURABILITY_QOS, // Least DurabilityTRANSIENT_LOCAL_DURABILITY_QOS,TRANSIENT_DURABILITY_QOS,PERSISTENT_DURABILITY_QOS // Greatest Durability
struct DurabilityQosPolicy {DurabilityQosPolicyKind kind;
};
2.5、DURABILITY_SERVICE
持久性缓冲区
struct DurabilityServiceQosPolicy {Duration_t service_cleanup_delay;HistoryQosPolicyKind history_kind;long history_depth;long max_samples;long max_instances;long max_samples_per_instance;
};
2.6 、RESOURCE_LIMITS
用于限制DDS可以分配的系统内存。
max_samples成员指定单个数据写程序或数据读取器可以跨其所有实例管理的最大样本数。 max_instances成员指定数据写入程序或数据读取器可以管理的最大实例数。 max_samples_per_instance成员指定可以在单个数据写程序或数据读取器中为单个实例管理的最大样本数。 所有这些成员的值默认为无限制(DDS :: LENGTH_UNLIMITED)。
struct ResourceLimitsQosPolicy {long max_samples;long max_instances;
long max_samples_per_instance;
};
2.7、PARTITION
允许在同一Domain下创建逻辑分区,处于同一分区内的DataWriter和DataReader才可以建立通信
struct PartitionQosPolicy {StringSeq name;
};
2.8、DEADLINE
如果希望某个Topic能够周期更新,可以设置DEADLINE属性。在数据的发布方设置DEADLINE,这意味着应用程序必须以小于DEADLINE的周期去更新Topic,而在数据的订阅方设置DEADLINE,这意味着数据的发布方必须以小于DEADLINE的周期去发布Topic。
struct DeadlineQosPolicy {Duration_t period;
};
2.9、LIFESPAN
通过设置LIFESPAN,可以使DataWriter写入的每个数据样本都有一个关联的“到期时间”,超过该时间后,该数据样本不再传送给任何应用程序,并且这些数据将从DataReader缓存中清除。
比如:类似雷达等数据是随着时间快速变化的,如果出现故境一直是旧的数据,我们可以设置LIFESPAN来设置数据有效时间.
struct LifespanQosPolicy {Duration_t duration; // 有效时间,默认为永久
}
2.10、USER_DATA
允许应用程序将一个字节序列与DomainParticipant、DataReader或DataWiter进行关联,该字节序列通过内建Topic进行分发,常用于分发安全凭证,应用程序可通过此凭证验证数据的有效性。
struct UserDataQosPolicy {sequence<octet> value;
};
2.11、TOPIC_DATA
允许应用程序将一个字节序列与Topic相关联,该字节序列通过内建Topic进行分发常用于为Topic添加附加信息
struct TopicDataQosPolicy {sequence<octet> value;
};
2.12、GROUP_DATA
允许应用程序将一个字节序列与Publisher或Subscriber相关联,该字节序列通过内建Topic进行分发。
可以携带用户定义的信息,在服务发现的过程中就可以交换一些用户数据,从而做一些想做的事,比如安全凭证啥的。
struct GroupDataQosPolicy {sequence<octet> value;
};
2.13、TRANSPORT_PRIORITY
控制传输数据的优先级,由一个整数表示,值越大优先级越高
struct TransportPriorityQosPolicy {long value;
};
2.14、LATENCY_BUDGET
用于控制数据传输的延迟。
它定义了数据从发送端到接收端的最大允许延迟时间。当数据的延迟超过设定的延迟预算时,DDS可以采取一些策略,如丢弃数据或调整传输优先级,以确保数据传输的实时性。
struct LatencyBudgetQosPolicy {Duration_t duration;
};
2.15、ENTITY_FACTORY
指定充当工厂的实体是否自动启用它创建的实例。
struct EntityFactoryQosPolicy {
Boolean autoenable_created_entities;
};
2.16、PRESENTATION
Coherent Access:在一组DDS data sample的更新都到达接收端后,应用程序才能够访问这一组data sample,适用于不同数据实例之间存在关联关系的场景
比如:坐标数据,x,y,z都获取到才能访问这组数据.
enum PresentationQosPolicyAccessScopeKind {INSTANCE_PRESENTATION_QOS, // (默认值)表示实例独立发生更改。TOPIC_PRESENTATION_QOS, // 接受的更改仅限于同一数据读取器或数据写入器中的所有实例。GROUP_PRESENTATION_QOS // 接受的更改仅限于同一发布者或订阅者中的所有实例。
};
struct PresentationQosPolicy {PresentationQosPolicyAccessScopeKind access_scope;boolean coherent_access;boolean ordered_access;
}
2.17、DESTINATION_ORDER
控制给定实例中的样本可供数据读取器使用的顺序。 如果指定了历史深度1(缺省值),则实例将反映所有数据写入程序写入该实例的最新值。
enum DestinationOrderQosPolicyKind {BY_RECEPTION_TIMESTAMP_DESTINATIONORDER_QOS, // 实例中的样本按数据读取器接收它们的顺序排序BY_SOURCE_TIMESTAMP_DESTINATIONORDER_QOS // 实例中的样本是根据数据写入程序提供的时间戳排序的
};
struct DestinationOrderQosPolicy {DestinationOrderQosPolicyKind kind;
};
2.18、WRITER_DATA_LIFECYCLE
该策略控制由数据写入程序管理的数据实例的生命周期。
当autodispose_unregistered_instances设置为true(缺省值)时,数据写入器在删除时时会释放实例。
struct WriterDataLifecycleQosPolicy {boolean autodispose_unregistered_instances;
};
2.19、READER_DATA_LIFECYCLE
策略控制数据读取器管理的数据实例的生命周期.
当autodispose_unregistered_instances设置为true(缺省值)时,数据读取器在删除时时会释放实例。
struct ReaderDataLifecycleQosPolicy {
Duration_t autopurge_nowriter_samples_delay; Duration_t autopurge_disposed_samples_delay;
};
2.20、TIME_BASED_FILTER
按照指定频率经过数据过滤。
设置该参数意味着在指定时间周期内只期望收到一个data sample,过多的data sample将被DataReader丢弃
该参数有助于优化网络负载及节点的计算资源。
比如:默认情况发送方能发送得很快(1秒100个),接受方只要求1秒5个,就可以设置这个参数控制发送速度,减小本地系统资源。
struct TimeBasedFilterQosPolicy {
Duration_t minimum_separation;
};
2.21、OWNERSHIP
当系统中存在针对同一个数据实例的多人DataWriter时,可以通过设置每DataWrter的"强度"来控制DataWiter的写入权限(“强度”最高的DataWiter拥有写入权限)。
比如: 有两套传感器(冗余)只使用一个,一个发生故障(高强度),切换到另一个传感器(次强度)。
enum OwnershipQosPolicyKind {
SHARED_OWNERSHIP_QOS, // 共享
EXCLUSIVE_OWNERSHIP_QOS // 独占
};
struct OwnershipQosPolicy {
OwnershipQosPolicyKind kind;
};
2.22、OWNERSHIP_STRENGTH
当OWNERSHIP类型设置为EXCLUSIVE时,OWNERSHIP_STRENGTH策略与OWNERSHIP策略一起使用。
struct OwnershipStrengthQosPolicy {
long value; // 独占的强度
};
相关文章:

OpenDDS的Qos策略
目录 1、前言2、QoS策略2.1、LIVELINESS2.2、RELIABILITY2.3、HISTORY2.4、DURABILITY2.5、DURABILITY_SERVICE2.6 、RESOURCE_LIMITS2.7、PARTITION2.8、DEADLINE2.9、LIFESPAN2.10、USER_DATA2.11、TOPIC_DATA2.12、GROUP_DATA2.13、TRANSPORT_PRIORITY2.14、LATENCY_BUDGET2…...
string基本操作(C++)
增 1.1 “” str str ss;cout << str << endl; //234561提取字串 2.1 substr substr(pos): 提取从位置pos开始到末尾的子串。 #include <iostream> #include <string> using namespace std;int main(){string str "123456";//substr(pos…...

【网站项目】123网上书城系统
🙊作者简介:拥有多年开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...

LeetCode148.排序链表
题目 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 输入:head [4,2,1,3] 输出:[1,2,3,4] 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 输入:head [] 输出:[] 思路…...

qt学习:网络调试助手客户端+服务端
目录 客户端 步骤 ui界面配置编辑 添加头函数,类成员数据,类成员函数 添加模块 构造函数 连接按钮 收到来自服务器的数据触发 发送按钮 断开按钮 向textEditRev文本编辑器中插入指定颜色的文本 服务端 步骤 ui界面配置 添加头函数&…...
C语言拾遗
函数的地址传递: 函数体内部想要修改函数体外部变量值的时候,使用地址传递 int set(int *pa) {//功能 } int main(void) {int a0;set(&a);//此时a的值经过set函数的修改,且传递到了main函数 } 函数体内想修改函数体外部指针的值的时候…...

大唐杯学习笔记:Day4
1.1NR帧结构 5G NR中,依然采用一帧10ms,并将一帧分为10子帧,每个子帧为1ms。每个子帧包含几个时隙(slot),每个时隙由14个OFDM符号构成(在常规CP下)。 μ \mu μ Δ f 2 μ ∗ 15 [ K H Z ] \Delta f2^{\mu}*15[KHZ] Δf2μ∗15[KHZ]Cyclic prefix015Normal130Normal260Normal…...

docker基线安全修复和容器逃逸修复
一、docker安全基线存在的问题和修复建议 1、将容器的根文件系统挂载为只读 修复建议: 添加“ --read-only”标志,以允许将容器的根文件系统挂载为只读。 可以将其与卷结合使用,以强制容器的过程仅写入要保留的位置。 可以使用命令&#x…...
ZooKeeper概述
ZooKeeper是一个开源的分布式协调服务,由Apache Software Foundation维护。它主要用于解决分布式应用中遇到的一些最常见问题,如命名服务、状态同步、配置管理和群集管理等。通过提供一套简单但强大的API,ZooKeeper使得从简单的锁服务到复杂的…...

【sgCollapseBtn】自定义组件:底部折叠/展开按钮
特性: 支持自定义折叠状态支持自定义标签名称 sgCollapseBtn源码 <template><div :class"$options.name" click"show !show" :placement"placement"><div class"collapse-btns"><div class"c…...

如何根据玩家数量和游戏需求选择最合适的服务器配置?
根据玩家数量和游戏需求选择最合适的服务器配置,首先需要考虑游戏的类型、玩家数量、预计的在线时间以及对内存和CPU性能的需求综合考虑。对于大型多人在线游戏,如MMORPG或MOBA等,由于需要更多的CPU核心数来支持更复杂的游戏逻辑和处理大量数…...
问题解决:各版本的vc_redist下载地址 缺少msvcr100.dll、msvcr120.dll、msvcr140.dll
Visual C Redistributable for Visual Studio各版本的官方链接。解决缺少msvcr100.dll、msvcr120.dll、msvcr140.dll的问题。 下面全部为官方链接: Microsoft Visual C Redistributable 2019 x86: https://aka.ms/vs/16/release/VC_redist.x86.exe x64: https://ak…...

182基于matlab的半监督极限学习机进行聚类
基于matlab的半监督极限学习机进行聚类,基于流形正则化将 ELM 扩展用于半监督,三聚类结果可视化输出。程序已调通,可直接运行。 182matlab ELM 半监督学习 聚类 模式识别 (xiaohongshu.com)...
C语言数组案例编程
1. 编写一个程序实现:从键盘输入15个整数存入数组,然后统计其中正整数的个数。 【要求】采用函数编程 #include<stdio.h> void input(int a[],int n) {int i; for(i0;i<n;i)scanf("%d",&a[i]); }int positiveNum(int a[],int n…...

NLP - 依存句法分析、句子歧义
1. 语言结构的两种观点 Constituency phrase struct grammar context-free grammars(CFGs)Dependency structure 对于context-free grammars(CFGs) 短语结构(Constituency):短语结构语法是一种描述语言结构的方法,它将句子划…...

vue实现图片上传至oss,返回url插入数据库,最后在前端页面上回显图片
vue前端上传图像 上传图片 使用上传图片的upload组件 <el-form-item label"设备图像"><el-upload//设置class样式class"avatar-uploader"//绑定上传路径:action"uploadUrl"//携带token值:headers"tokenInfo":show-file-lis…...

C++学习笔记:set和map
set和map set什么是setset的使用 关联式容器键值对 map什么是mapmap的使用map的插入方式常用功能map[] 的灵活使用 set 什么是set set是STL中一个底层为二叉搜索树来实现的容器 若要使用set需要包含头文件 #include<set>set中的元素具有唯一性(因此可以用set去重)若用…...
990-28产品经理:Different types of IT risk 不同类型的IT风险
Your IT systems and the information that you hold on them face a wide range of risks. If your business relies on technology for key operations and activities, you need to be aware of the range and nature of those threats. 您的IT系统和您在其中持有的信息面临…...
wpa_supplicant与用户态程序的交互分析
1 wpa_supplicant与用户态程序wpa_cli的交互过程 1.1 交互接口类型 wpa_supplicant与用户态程序交互的主要接口包括以下几种: 1)命令行界面:通过命令行工具 wpa_cli 可以与 wpa_supplicant 进行交互。wpa_cli 允许用户执行各种 wpa_suppli…...

JavaScript继承 寄生组合式继承 extends
JavaScript继承 1、JS 的继承到底有多少种实现方式呢? 2、ES6 的 extends 关键字是用哪种继承方式实现的呢? 继承种类 原型链继承 function Parent1() {this.name parentlthis.play [1, 2, 3] }function Child1() {this.type child2 }Child1.prototype new Parent1(…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
postgresql|数据库|只读用户的创建和删除(备忘)
CREATE USER read_only WITH PASSWORD 密码 -- 连接到xxx数据库 \c xxx -- 授予对xxx数据库的只读权限 GRANT CONNECT ON DATABASE xxx TO read_only; GRANT USAGE ON SCHEMA public TO read_only; GRANT SELECT ON ALL TABLES IN SCHEMA public TO read_only; GRANT EXECUTE O…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
css3笔记 (1) 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...