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(…...
国防科技大学计算机基础课程笔记02信息编码
1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制,因此这个了16进制的数据既可以翻译成为这个机器码,也可以翻译成为这个国标码,所以这个时候很容易会出现这个歧义的情况; 因此,我们的这个国…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
工程地质软件市场:发展现状、趋势与策略建议
一、引言 在工程建设领域,准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具,正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
《基于Apache Flink的流处理》笔记
思维导图 1-3 章 4-7章 8-11 章 参考资料 源码: https://github.com/streaming-with-flink 博客 https://flink.apache.org/bloghttps://www.ververica.com/blog 聚会及会议 https://flink-forward.orghttps://www.meetup.com/topics/apache-flink https://n…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
代理篇12|深入理解 Vite中的Proxy接口代理配置
在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...
Golang——9、反射和文件操作
反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一:使用Read()读取文件2.3、方式二:bufio读取文件2.4、方式三:os.ReadFile读取2.5、写…...
