一文总结Cyclonedds(C++) QoS服务质量策略(持续更新)

1 可靠性 RELIABILITY

1.1 作用

Reliability可靠性策略的作用就是定义了数据传输的可靠性要求,确保数据到达目标节点。
它描述的就是一个数据读取者DataReader能够可靠的接收来自数据写入者DataWriter的数据。

1.2 应用场景

它适用于对数据可靠性要求较高的场景,主要是对数据有在即时性、准确性和可靠新要求的场景
例如:

1、实时控制系统、实时监控系统等。
在实时数据传输过程中,数据的即时性和准确性至关重要。RELIABILITY策略可以确保数据在传输过程中不丢失、不重复,并按照发送顺序进行传递。这对于需要准确和连续的数据更新的实时应用非常重要。

2、航空航天系统、医疗设备等。
数据的可靠性是至关重要的,即使在网络不稳定或发生故障的情况下也需要保证数据的完整性。通过使用RELIABILITY策略,DDS可以提供可靠的数据传输保证,确保数据能够完整地到达目标节点。

3、金融交易系统、数据中心
在某些场景中,需要对数据进行备份和冗余存储,以保证数据的可靠性和持久性。通过使用RELIABILITY策略,DDS可以将数据传输到多个节点,并在其中一个节点发生故障时自动切换到备用节点,确保数据不丢失

1.3 模式种类

Reliability可靠性策略有两种模式,分别是可靠模式(reliable)尽力而为模式(best effort),它们之间的区别主要体现在数据传输的可靠性和保证机制上。

1.3.1 可靠模式(reliable)

可靠性模式下有以下三个保证:

1 数据传输保证
在可靠模式下,DDS会采取一系列的机制来保证数据的可靠传输。它使用ACK(Acknowledgment)机制,即接收端会向发送端发送确认消息来告知数据已经接收到。发送端会在收到确认消息后才认为数据传输成功,并继续发送下一个数据。如果发送端未收到确认消息,它会尝试重新发送数据,直到接收端确认接收成功为止。

2 数据不丢失
可靠模式可以确保数据在传输过程中不会丢失,即使在网络不稳定或发生故障的情况下也能保证数据的完整性。

3 数据顺序保证
可靠模式还能保证数据按照发送的顺序进行传递,即接收端能够按照发送顺序正确接收到数据。

1.3.2 尽力而为模式(best effort)

1 数据传输不保证
在尽力而为模式下,DDS不提供对数据传输的可靠性保证。它不会使用ACK机制,也不会发生数据重传,发送端不会等待接收端的确认消息,而是尽力发送数据,不保证数据是否最终到达接收端。

2 数据可能丢失
尽力而为模式下,由于不保证数据传输的可靠性,数据可能会在传输过程中丢失,特别是在网络不稳定或拥塞的情况下。

可靠模式下DDS提供了一系列机制来保证数据的可靠传输,包括ACK机制、重发机制等,确保数据不丢失、按顺序传递;而尽力而为模式下DDS不提供数据传输的可靠性保证,数据有可能丢失。选择哪种模式应根据应用对数据传输可靠性的要求来决定。根据两种模式的特点,尽力而为模式适合周期性特别强,且全部需要最新数据样本的应用;如果是要求全部信息样本,那就设置为可靠模式。

1.4 Reliability中的参数讲解

在DCPS的QoS策略中,Reliability(可靠性)是一个重要的策略项,用于确保消息的可靠传输。其常见的参数有两个:

kind(类型):Reliability策略的模式类型,如前所述可以是BEST_EFFORT(尽力而为)RELIABLE(可靠性)

max_blocking_time(最大阻塞时间):当消息无法立即传递给订阅者时,在发送方等待的最大时间。如果在该时间内消息成功传递给订阅者,则被认为是可靠传输的。超过该时间仍未传递成功,则可能会采取其他策略。

通过设置max_blocking_time参数,可以控制消息在传输过程中的最大阻塞时间。这对于实时应用程序非常重要,因为它可以确保及时处理和传递重要的消息,同时避免过长的等待时间。不同的应用场景可能需要不同的最大阻塞时间,因此这个参数的值可以根据需求进行调整

1.5 应用实体

Reliability可靠性策略用在DataWriterDataReaderTopic三种实体上,通过设置在不同层级的实体上而发挥作用

2 基于时间的过滤 TIME_BASED_FILTER

作用:设置基于时间的过滤,仅仅传输或者接收满足特定时间范围的数据。也可以说是根据时间条件对数据包进行过滤和控制。
注意:需要在publisher和subscriber端进行一直的设置,以保证发送与接收符合时间条件

2.1 参数(6大参数)

1、minimum_separation 最小间隔时间
指定两个相邻样本之间的最小时间间隔。如果两个样本的时间戳之间的间隔小于此值,则后续样本将被过滤掉。

2、maximum_separation 最大间隔时间
指定两个相邻样本之间的最大时间间隔。如果两个样本的时间戳之间的间隔大于此值,则后续样本将被过滤掉。

3、minimum_sample_count 最小样本数量
指定在应用TIME_BASED_FILTER策略之前必须接收到的最小样本数。如果接收到的样本数量小于此值,则不会应用过滤策略。

4、maximum_sample_count 最大样本数量
指定在应用TIME_BASED_FILTER策略之前可以接收的最大样本数。如果接收到的样本数量超过此值,则不会应用过滤策略。

5、minimum_separation_duration_kind:最小间隔时间单位
指定最小间隔时间的单位,可以是纳秒、微秒、毫秒、秒、分钟、小时或天。

6、maximum_separation_duration_kind:最大间隔时间单位
指定最大间隔时间的单位,可以是纳秒、微秒、毫秒、秒、分钟、小时或天。

2.2 应用实体

可以使用在DataReaderDataWriter上,用在DataReader上指定一个时间间隔(minimum_separation),在这个时间间隔内检查一次数据,如果它为0,则表示没有数据被过滤。

在这里插入图片描述

3 数据传输的目标顺序 DESTINATION_ORDER

作用:控制订阅者在接收多个发布者发送数据时的顺序。不同的参数取值会导致不同的接收顺序,从而满足不同的应用需求。

3.1 参数:

1、BY_SOURCE_TIMESTAMP
按照发布者发布数据的时间戳顺序接收数据。这是默认的策略。如果多个发布者同时发布数据,订阅者会根据数据的时间戳来确定接收数据的顺序

2、BY_RECEPTION_TIMESTAMP
按照数据接收的时间戳顺序接收数据。即使多个发布者同时发布数据,订阅者也会根据数据接收的时间来确定接收数据的顺序。

3、BY_SOURCE_CREATION
按照发布者创建的顺序接收数据。如果多个发布者同时创建,订阅者会根据发布者的创建顺序来确定接收数据的顺序。

4、BY_RECEPTION_CREATION
按照数据接收时发布者创建的顺序接收数据。即使多个发布者同时创建,订阅者也会根据数据接收时发布者的创建顺序来确定接收数据的顺序

3.2 应用实体:

DataReader

注意事项:需要注意的是,这些参数只对有序的主题有效。如果主题被标记为无序,那么无论设置哪个参数,订阅者都会按照接收到数据的顺序进行处理。此外,使用DESTINATION_ORDER参数可能会引入一定的延迟

4 历史:HISTORY

作用:在CycloneDDS中,QoS策略中的HISTORY参数用于控制数据的历史记录它决定了订阅者可以接收到关于某个主题的历史数据

4.1参数

下面是各个参数及其作用的简单解释:

1、Kind(类型):指定历史数据的类型。可以是最新的数据、所有数据或者特定时间段内的数据。

1、KEEP_LAST:最新的历史数据
2、KEEP_ALL:所有的数据
3、KEEP_LAST_WITH_DEPTH:特定时间内的数据

2、Depth(深度):指定历史数据的最大数量,或者要保留的历史数据的最大数量。订阅者可以接收到的历史数据数量不能超过这个值,这个值已经是maxValue。

注意:只有当参数kindKEEP_LAST 或者 KEEP_LAST_WITH_DEPTH时才需要这个DEPTH参数

3、Duration(持续时间):指定历史数据的时间窗口。订阅者可以接收到在这个时间段内发布的历史数据。

4、Cleanup Delay(清理延迟):指定历史数据从缓存中清除的延迟时间。在这段时间后,历史数据将被自动清除。


举个例子来说

假设有一个主题是温度传感器数据,发布者每秒钟发布一次数据。如果设置Kind为最新的数据,Depth为10,那么订阅者每次订阅时,可以接收到最近10秒内的温度数据;如果设置Kind为所有数据,订阅者可以获取到从开始发布数据到现在所有的温度数据


这对于需要过往数据的应用程序来讲非常重要。

注意::确保该QoS在Publisher和Subscriber之间进行一致的配置。

4.2应用实体

DataReaderDataWriter

5 截止时间 DEADLINE

作用:DEADLINE(截止期限)指的是发送数据的截止时间,即数据必须在该时间之前被传输完成。这个参数可以帮助开发者控制数据传输的实时性,从而确保数据在特定时间内传输和接收。

5.1 参数

下面是一些DEADLINE相关的参数解释:

period:周期性发布数据的时间间隔。如果设置了period,那么DEADLINE就是以这个周期为基准进行计算。

offset:偏移量,表示相对于周期起始点的偏移时间。例如,如果设置了offset为1秒,那么DEADLINE就是从每个周期的第1秒开始计算。

deadline_missed_period:当一个数据的DEADLINE被错过后,下次发布该数据之前需要等待的时间。

budget:数据发送的时间预算,即分配给数据发送的最大时间。如果发送数据超过了这个时间预算,就会发生deadline miss(截止期限错过)。

  1. List item

5.2 应用实体

DataReaderDataWriter

6 持久性 DURABILITY

作用:用于定义数据的持久性存储类型

6.1 参数

Volatile:不保证数据的持久性,数据仅在内存中存在。一旦发送或接收到数据,如果没有订阅者接收,数据将会丢失。
假设一个传感器发布当前温度数据,使用Volatile持久性参数,如果没有订阅者订阅该数据,数据将不再可用。

Transient Local:保证数据在发送者和本地订阅者之间的可靠性,但不保证在网络中的可靠性。数据在发送者和本地订阅者之间进行缓存,但在网络中传输时不可靠。
示例:一个控制系统使用Transient Local持久性参数来保证本地订阅者接收到的数据是可靠的,但在网络传输时可能会丢失。

Transient:保证数据在发送者和所有订阅者之间的可靠性,但不保证历史数据的可靠性。数据在发送者和所有订阅者之间进行传输,但不会保存历史数据。
示例:一个实时监测系统使用Transient持久性参数来保证所有订阅者都能接收到数据,并确保数据的实时性,但不需要保存历史数据。

Persistent:保证数据在发送者和所有订阅者之间的可靠性,并且保留历史数据。数据在发送者和所有订阅者之间进行传输,并在每个节点上持久保存历史数据。
示例:一个数据采集系统使用Persistent持久性参数来确保所有订阅者都能接收到数据。

6.2 应用实体

DataReaderDataWriter

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Python中的eval()函数是一个内置函数,它可以将一个字符串作为代码来执行。它的基本用法是将一个字符串当作Python表达式来执行,并返回表达式的结果。下面是对Python eval()函数的一些总结: 1. eval()函数的基本语法如下: ``` eval(expression[, globals[, locals]]) ``` 其中,expression为需要执行的Python表达式,globals和locals为可选参数,分别表示全局和局部命名空间字典。 2. eval()函数可以执行任何Python表达式,包括函数调用、赋值语句等。例如: ``` x = 1 y = 2 print(eval("x + y")) ``` 输出结果为:3 3. eval()函数还可以执行包含控制语句的表达式,例如if语句、for循环语句等。但是要注意,eval()函数执行的代码必须是安全可靠的,否则可能会有安全风险。例如: ``` x = 1 y = 2 z = eval("if x > y: x else: y") print(z) ``` 输出结果为:2 4. eval()函数还可以执行包含异常处理语句的表达式。例如: ``` try: eval("1/0") except ZeroDivisionError as e: print("Error:", e) ``` 输出结果为:Error: division by zero 5. eval()函数还可以接受一个字典作为globals参数,用于指定全局命名空间。例如: ``` x = 1 y = 2 print(eval("x + y", {"x": 2, "y": 3})) ``` 输出结果为:5 6. eval()函数还可以接受一个字典作为locals参数,用于指定局部命名空间。例如: ``` x = 1 y = 2 print(eval("x + y", {}, {"x": 2, "y": 3})) ``` 输出结果为:5 7. eval()函数的返回值为表达式的结果。例如: ``` x = 1 y = 2 z = eval("x + y") print(z) ``` 输出结果为:3 总之,eval()函数是Python中非常有用的一个内置函数,它可以让我们在运行时执行动态的Python代码。但是要注意,使用eval()函数时需要谨慎,避免因为执行不安全的代码而导致安全问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

江南霹雳堂雷家雷无桀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值