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(…...
微信小程序地图气泡实战:从callout到customCallout的性能与兼容性深度解析
1. 微信小程序地图气泡的核心需求解析 第一次接触微信小程序地图气泡需求时,我也被各种技术方案搞得晕头转向。经过多个项目的实战验证,我发现开发者最常遇到的三大核心问题就是:内容复杂度、性能瓶颈和跨平台兼容性。比如在电商小程序中&…...
UE5地牢生成实战:从零搭建程序化地下城(附完整蓝图逻辑)
UE5地牢生成实战:从零搭建程序化地下城(附完整蓝图逻辑) 在游戏开发中,程序化内容生成(PCG)技术正变得越来越重要。想象一下,你正在开发一款Roguelike游戏,每次玩家进入地牢都能获得全新的探索体验——这正…...
RTOS学习指南:从理论到实践的完整路径
1. RTOS入门路径解析:从理论到实践的完整指南作为一名嵌入式开发者,我经历过从裸机开发到RTOS应用的完整转型过程。记得第一次接触RTOS时,面对任务调度、信号量等新概念确实一头雾水。但通过系统学习和项目实践,我发现掌握RTOS并没…...
第1节:如何统一多源文档格式?
RAG与Agent性能调优:1.如何统一多元文档格式? Gitee地址:https://gitee.com/agiforgagaplus/OptiRAGAgent 文章详情目录:RAG与Agent性能调优 下一节:待更新 导论 从路口着手解决问题 在RAG技术中,文档…...
四场景下的两阶段鲁棒优化模型构建与实施——列与约束生成算法及其数据处理机制探究
两阶段鲁棒优化模型 多场景 采用matlab编程两阶段鲁棒优化程序,考虑四个场景,模型采用列与约束生成(CCG)算法进行求解,场景分布的概率置信区间由 1-范数和∞-范数约束,程序含拉丁超立方抽样kmeans数据处理程…...
微前端状态管理的真相:Module Federation + 跨应用通信实战
本周大前端要闻Compose Multiplatform v1.11.10-alpha01:进一步完善跨平台 UI 状态同步能力,ViewModel 共享机制改进KotlinConf’26 演讲阵容公布:多场 Session 聚焦 Kotlin 多平台架构与状态管理,值得关注Retrofit 3.0.0 正式发布…...
高速移动场景下无线信道的延迟-多普勒域建模与优化
1. 高速移动场景下的无线信道挑战 想象一下你正坐在时速120公里的高铁上刷视频,突然画面开始卡顿——这就是典型的高速移动场景通信问题。当收发端相对速度超过100km/h时,传统无线信道模型就会像老式收音机遇到隧道一样"失灵"。我在参与某车企…...
02_Elasticsearch知识体系之Mapping映射设计与索引建模实战
02_Elasticsearch知识体系之Mapping映射设计与索引建模实战 Elasticsearch知识体系 基础概念层数据存储层【本文】查询语言层搜索能力层数据处理层集群架构层开发集成层AI增强层行业应用层 关键词: Elasticsearch、Mapping、动态映射、显式映射、字段类型、分片、副…...
GitHub中文插件终极指南:3分钟让GitHub界面全面中文化
GitHub中文插件终极指南:3分钟让GitHub界面全面中文化 【免费下载链接】github-chinese GitHub 汉化插件,GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 你是否曾经因为GitH…...
教育科技赋能自主学习:JiYuTrainer的平衡之道与效率提升方案
教育科技赋能自主学习:JiYuTrainer的平衡之道与效率提升方案 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 教学管控与学习自由的平衡难题 在数字化教育普及的今天&…...
