写在开篇·蓉儿继续挖坑上回说到郭靖搞清楚了DDS发现阶段的完整流程——SPDP找人、SEDP找内容、本地匹配、单播传输。郭靖合上笔记本若有所思“蓉儿我发现一个细节——匹配的时候除了Topic名字和数据类型还要检查QoS。这个QoS到底是什么为什么这么重要”黄蓉咬了口糖葫芦“问得好QoS是DDS的灵魂。今天就把QoS讲透——它是什么有哪些常用策略什么场景该用哪个。”一、QoS是什么——发布者和订阅者的“服务约定”黄蓉在白板上写下定义QoS Quality of Service 服务质量简单说发布者和订阅者之间的“服务约定”——你承诺给我什么样的服务质量。郭靖问“能不能举个例子”黄蓉画了一张对比图┌─────────────────────────────────────────────────────────────────────┐ │ 没有QoS大家都一样 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 刹车信号紧急—— 排队 —— [慢悠悠发送] —— 刹车延迟 │ │ 娱乐信号不紧急—— 排队 —— [正常发送] │ │ │ └─────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────┐ │ 有QoS刹车可以插队 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 刹车信号高优先级—— 插队—— [立即发送] —— 刹车及时 │ │ 娱乐信号低优先级—— 排队等待 —— [稍后发送] │ │ │ └─────────────────────────────────────────────────────────────────────┘QoS的核心作用告诉DDS“这个数据很重要那个数据可以随便”。二、QoS是谁定的怎么生效的郭靖问出了关键问题“这个QoS是谁定的发布者说了算还是订阅者说了算”黄蓉画了一张表问题答案谁定QoS架构师在设计阶段定写在设计文档里怎么生效发布者和订阅者在代码里创建Writer/Reader时分别指定QoS不一致怎么办DDS会检查兼容性。能协商的就取交集不能协商的就匹配失败QoS不是运行时协商出来的是设计阶段就定好的“规矩”。两边都要遵守不一致就配对不了。三、最常用的QoS策略工程师必知黄蓉列了一张表只讲最常用的几个QoS策略作用可选值适用场景可靠性数据必须送到还是尽力而为RELIABLE / BEST_EFFORT刹车指令用RELIABLE摄像头图像用BEST_EFFORT优先级数据在网络中的传输优先级数字0-255越大越优先刹车指令高优先级娱乐信号低优先级延迟预算数据必须在多少毫秒内送达毫秒数如1ms、100ms刹车指令1ms视频100ms持久性订阅者启动晚了还能不能收到历史数据TRANSIENT_LOCAL / VOLATILE状态数据用TRANSIENT实时数据用VOLATILE历史记录保留多少条历史数据KEEP_LAST(n) / KEEP_ALL最新数据用KEEP_LAST(1)需要全量用KEEP_ALL四、可靠性RELIABLE vs BEST_EFFORT黄蓉把这组QoS单独拿出来讲因为这是最常用的策略说明优点缺点RELIABLE数据必须送到DDS自动重传不丢数据有重传开销延迟可能变大BEST_EFFORT尽力而为丢了不重传快无重传开销可能丢数据┌─────────────────────────────────────────────────────────────────────┐ │ RELIABLE vs BEST_EFFORT │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 刹车指令RELIABLE │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │ 发 │────→│ 收 │────→│ 确认 │ ← 必须确认不确认就重发 │ │ └─────┘ └─────┘ └─────┘ │ │ │ │ 摄像头图像BEST_EFFORT │ │ ┌─────┐ ┌─────┐ │ │ │ 发 │────→│ 收 │ ← 发了不管丢了就丢了 │ │ └─────┘ └─────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘郭靖的理解“RELIABLE是挂号信——必须签收丢了重发。BEST_EFFORT是平信——扔进邮筒就不管了丢了不补。”五、优先级——刹车插队视频排队黄蓉用一张图解释优先级的作用┌─────────────────────────────────────────────────────────────────────┐ │ 优先级谁插队谁排队 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 网络通道优先级队列 │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 高优先级队列0ms处理 │ │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ │ │ 刹车 │ │ 刹车 │ │ 刹车 │ ← 立即发送 │ │ │ │ └──────┘ └──────┘ └──────┘ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 低优先级队列排队等待 │ │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ │ │ 视频 │ │ 视频 │ │ 视频 │ │ 视频 │ ← 慢慢发 │ │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘郭靖的理解“优先级高的数据可以插队。刹车指令必须插队视频流不着急排队就行。”六、延迟预算——超过时间就别要了郭靖问“延迟预算是什么意思”黄蓉画了一个例子┌─────────────────────────────────────────────────────────────────────┐ │ 延迟预算超过时间就别要了 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 刹车指令延迟预算 1ms │ │ ┌─────┐ ┌─────────────┐ ┌─────┐ │ │ │ 发 │────→│ 网络传输 │────→│ 收 │ ✅ 1ms内到了有效 │ │ └─────┘ │ 耗时0.8ms │ └─────┘ │ │ └─────────────┘ │ │ │ │ 刹车指令延迟预算 1ms │ │ ┌─────┐ ┌─────────────┐ ┌─────┐ │ │ │ 发 │────→│ 网络拥堵 │────→│ 收 │ ❌ 1.5ms才到丢弃 │ │ └─────┘ │ 耗时1.5ms │ └─────┘ 太晚了不能用 │ │ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘延迟预算告诉DDS超过这个时间的数据我不要了直接丢。郭靖的理解“刹车指令必须在1ms内到晚了就不要了因为车可能已经撞了。”七、持久性——晚来的订阅者还能收到历史数据吗郭靖问“如果域控启动晚了摄像头已经发了10帧图像域控能收到之前的数据吗”黄蓉用例子回答持久性策略行为场景VOLATILE易失只收订阅之后的数据实时数据如摄像头图像晚了就不需要了TRANSIENT_LOCAL临时持久保留最后几条历史数据给晚来的订阅者状态数据如当前车速、车门状态晚了也要知道┌─────────────────────────────────────────────────────────────────────┐ │ TRANSIENT_LOCAL vs VOLATILE │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ VOLATILE易失 │ │ 摄像头发帧1 帧2 帧3 帧4 帧5 │ │ ↑ │ │ 域控启动 │ │ 只能收到帧5之后的数据帧1-4丢了 │ │ │ │ TRANSIENT_LOCAL临时持久 │ │ BMS发电压12V 电压12.1V 电压12.2V │ │ ↑ │ │ 座舱启动 │ │ 还能收到最近保留的电压值比如最后3条 │ │ │ └─────────────────────────────────────────────────────────────────────┘郭靖的理解“摄像头图像是实时的晚来的帧没必要看。BMS电压是状态晚来的也要知道当前电压是多少。”八、QoS配置示例只讲场景不写代码黄蓉用两个场景把QoS策略串起来场景一刹车指令安全关键QoS策略配置值原因可靠性RELIABLE不能丢一帧都不能丢优先级HIGH255必须插队优先发送延迟预算1ms必须在1ms内到达持久性VOLATILE只需要新的刹车指令历史不需要场景二摄像头图像大数据、实时QoS策略配置值原因可靠性BEST_EFFORT丢几帧没关系人眼看不出优先级NORMAL100正常排队不需要插队延迟预算100ms100ms以内到达即可30fps够用了历史记录KEEP_LAST(1)只保留最新一帧旧的不要九、QoS不匹配会发生什么郭靖问“如果摄像头配置了BEST_EFFORT域控要求RELIABLE会怎样”黄蓉画了结果发布者QoS订阅者QoSDDS行为BEST_EFFORTBEST_EFFORT✅ 兼容正常连接RELIABLERELIABLE✅ 兼容正常连接BEST_EFFORTRELIABLE❌不兼容不会建立连接RELIABLEBEST_EFFORT⚠️ 降级为BEST_EFFORT如果策略支持协商发布者和订阅者的QoS必须兼容否则配对失败收不到任何数据。十、黄蓉的小本本郭靖翻开她的笔记本上面写着QoS核心要点1. QoS是什么发布者和订阅者之间的“服务约定”2. 谁定的架构师在设计阶段定写在设计文档里3. 怎么生效发布者和订阅者分别指定DDS检查兼容性4. 最常用的QoS策略可靠性RELIABLE vs BEST_EFFORT优先级HIGH vs NORMAL延迟预算1ms vs 100ms持久性TRANSIENT_LOCAL vs VOLATILE历史记录KEEP_LAST vs KEEP_ALL5. 一句话总结刹车指令RELIABLE HIGH 1ms VOLATILE摄像头图像BEST_EFFORT NORMAL 100ms KEEP_LAST(1)写在最后郭靖合上笔记本“QoS是发布者和订阅者之间的服务约定。可靠性决定丢不丢数据优先级决定能不能插队延迟预算决定超时要不要持久性决定晚来的能不能补。刹车指令和摄像头图像的QoS完全不一样各有各的配置。”黄蓉咬了口糖葫芦“全明白了”郭靖点头“明白了。刹车用RELIABLE插队视频用BEST_EFFORT排队。QoS搞错了轻则性能差重则收不到数据。”黄蓉眨眨眼“DDS从概念到报文到发现到QoS你算是完整过了一遍。那你知道QoS在DDS数据帧中是如何实现内连以及哪些字段、如何体现的吗”郭靖摇头。黄蓉眨眨眼“那就下期分解”打完收工886。
车载以太网之要火系列 - 第58篇:郭大侠学DDS(QoS策略):服务质量花样多,刹车插队视频播
写在开篇·蓉儿继续挖坑上回说到郭靖搞清楚了DDS发现阶段的完整流程——SPDP找人、SEDP找内容、本地匹配、单播传输。郭靖合上笔记本若有所思“蓉儿我发现一个细节——匹配的时候除了Topic名字和数据类型还要检查QoS。这个QoS到底是什么为什么这么重要”黄蓉咬了口糖葫芦“问得好QoS是DDS的灵魂。今天就把QoS讲透——它是什么有哪些常用策略什么场景该用哪个。”一、QoS是什么——发布者和订阅者的“服务约定”黄蓉在白板上写下定义QoS Quality of Service 服务质量简单说发布者和订阅者之间的“服务约定”——你承诺给我什么样的服务质量。郭靖问“能不能举个例子”黄蓉画了一张对比图┌─────────────────────────────────────────────────────────────────────┐ │ 没有QoS大家都一样 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 刹车信号紧急—— 排队 —— [慢悠悠发送] —— 刹车延迟 │ │ 娱乐信号不紧急—— 排队 —— [正常发送] │ │ │ └─────────────────────────────────────────────────────────────────────┘ ┌─────────────────────────────────────────────────────────────────────┐ │ 有QoS刹车可以插队 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 刹车信号高优先级—— 插队—— [立即发送] —— 刹车及时 │ │ 娱乐信号低优先级—— 排队等待 —— [稍后发送] │ │ │ └─────────────────────────────────────────────────────────────────────┘QoS的核心作用告诉DDS“这个数据很重要那个数据可以随便”。二、QoS是谁定的怎么生效的郭靖问出了关键问题“这个QoS是谁定的发布者说了算还是订阅者说了算”黄蓉画了一张表问题答案谁定QoS架构师在设计阶段定写在设计文档里怎么生效发布者和订阅者在代码里创建Writer/Reader时分别指定QoS不一致怎么办DDS会检查兼容性。能协商的就取交集不能协商的就匹配失败QoS不是运行时协商出来的是设计阶段就定好的“规矩”。两边都要遵守不一致就配对不了。三、最常用的QoS策略工程师必知黄蓉列了一张表只讲最常用的几个QoS策略作用可选值适用场景可靠性数据必须送到还是尽力而为RELIABLE / BEST_EFFORT刹车指令用RELIABLE摄像头图像用BEST_EFFORT优先级数据在网络中的传输优先级数字0-255越大越优先刹车指令高优先级娱乐信号低优先级延迟预算数据必须在多少毫秒内送达毫秒数如1ms、100ms刹车指令1ms视频100ms持久性订阅者启动晚了还能不能收到历史数据TRANSIENT_LOCAL / VOLATILE状态数据用TRANSIENT实时数据用VOLATILE历史记录保留多少条历史数据KEEP_LAST(n) / KEEP_ALL最新数据用KEEP_LAST(1)需要全量用KEEP_ALL四、可靠性RELIABLE vs BEST_EFFORT黄蓉把这组QoS单独拿出来讲因为这是最常用的策略说明优点缺点RELIABLE数据必须送到DDS自动重传不丢数据有重传开销延迟可能变大BEST_EFFORT尽力而为丢了不重传快无重传开销可能丢数据┌─────────────────────────────────────────────────────────────────────┐ │ RELIABLE vs BEST_EFFORT │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 刹车指令RELIABLE │ │ ┌─────┐ ┌─────┐ ┌─────┐ │ │ │ 发 │────→│ 收 │────→│ 确认 │ ← 必须确认不确认就重发 │ │ └─────┘ └─────┘ └─────┘ │ │ │ │ 摄像头图像BEST_EFFORT │ │ ┌─────┐ ┌─────┐ │ │ │ 发 │────→│ 收 │ ← 发了不管丢了就丢了 │ │ └─────┘ └─────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘郭靖的理解“RELIABLE是挂号信——必须签收丢了重发。BEST_EFFORT是平信——扔进邮筒就不管了丢了不补。”五、优先级——刹车插队视频排队黄蓉用一张图解释优先级的作用┌─────────────────────────────────────────────────────────────────────┐ │ 优先级谁插队谁排队 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 网络通道优先级队列 │ │ ┌─────────────────────────────────────────────────────────────┐ │ │ │ 高优先级队列0ms处理 │ │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ │ │ 刹车 │ │ 刹车 │ │ 刹车 │ ← 立即发送 │ │ │ │ └──────┘ └──────┘ └──────┘ │ │ │ ├─────────────────────────────────────────────────────────────┤ │ │ │ 低优先级队列排队等待 │ │ │ │ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────┐ │ │ │ │ │ 视频 │ │ 视频 │ │ 视频 │ │ 视频 │ ← 慢慢发 │ │ │ │ └──────┘ └──────┘ └──────┘ └──────┘ │ │ │ └─────────────────────────────────────────────────────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘郭靖的理解“优先级高的数据可以插队。刹车指令必须插队视频流不着急排队就行。”六、延迟预算——超过时间就别要了郭靖问“延迟预算是什么意思”黄蓉画了一个例子┌─────────────────────────────────────────────────────────────────────┐ │ 延迟预算超过时间就别要了 │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ 刹车指令延迟预算 1ms │ │ ┌─────┐ ┌─────────────┐ ┌─────┐ │ │ │ 发 │────→│ 网络传输 │────→│ 收 │ ✅ 1ms内到了有效 │ │ └─────┘ │ 耗时0.8ms │ └─────┘ │ │ └─────────────┘ │ │ │ │ 刹车指令延迟预算 1ms │ │ ┌─────┐ ┌─────────────┐ ┌─────┐ │ │ │ 发 │────→│ 网络拥堵 │────→│ 收 │ ❌ 1.5ms才到丢弃 │ │ └─────┘ │ 耗时1.5ms │ └─────┘ 太晚了不能用 │ │ └─────────────┘ │ │ │ └─────────────────────────────────────────────────────────────────────┘延迟预算告诉DDS超过这个时间的数据我不要了直接丢。郭靖的理解“刹车指令必须在1ms内到晚了就不要了因为车可能已经撞了。”七、持久性——晚来的订阅者还能收到历史数据吗郭靖问“如果域控启动晚了摄像头已经发了10帧图像域控能收到之前的数据吗”黄蓉用例子回答持久性策略行为场景VOLATILE易失只收订阅之后的数据实时数据如摄像头图像晚了就不需要了TRANSIENT_LOCAL临时持久保留最后几条历史数据给晚来的订阅者状态数据如当前车速、车门状态晚了也要知道┌─────────────────────────────────────────────────────────────────────┐ │ TRANSIENT_LOCAL vs VOLATILE │ ├─────────────────────────────────────────────────────────────────────┤ │ │ │ VOLATILE易失 │ │ 摄像头发帧1 帧2 帧3 帧4 帧5 │ │ ↑ │ │ 域控启动 │ │ 只能收到帧5之后的数据帧1-4丢了 │ │ │ │ TRANSIENT_LOCAL临时持久 │ │ BMS发电压12V 电压12.1V 电压12.2V │ │ ↑ │ │ 座舱启动 │ │ 还能收到最近保留的电压值比如最后3条 │ │ │ └─────────────────────────────────────────────────────────────────────┘郭靖的理解“摄像头图像是实时的晚来的帧没必要看。BMS电压是状态晚来的也要知道当前电压是多少。”八、QoS配置示例只讲场景不写代码黄蓉用两个场景把QoS策略串起来场景一刹车指令安全关键QoS策略配置值原因可靠性RELIABLE不能丢一帧都不能丢优先级HIGH255必须插队优先发送延迟预算1ms必须在1ms内到达持久性VOLATILE只需要新的刹车指令历史不需要场景二摄像头图像大数据、实时QoS策略配置值原因可靠性BEST_EFFORT丢几帧没关系人眼看不出优先级NORMAL100正常排队不需要插队延迟预算100ms100ms以内到达即可30fps够用了历史记录KEEP_LAST(1)只保留最新一帧旧的不要九、QoS不匹配会发生什么郭靖问“如果摄像头配置了BEST_EFFORT域控要求RELIABLE会怎样”黄蓉画了结果发布者QoS订阅者QoSDDS行为BEST_EFFORTBEST_EFFORT✅ 兼容正常连接RELIABLERELIABLE✅ 兼容正常连接BEST_EFFORTRELIABLE❌不兼容不会建立连接RELIABLEBEST_EFFORT⚠️ 降级为BEST_EFFORT如果策略支持协商发布者和订阅者的QoS必须兼容否则配对失败收不到任何数据。十、黄蓉的小本本郭靖翻开她的笔记本上面写着QoS核心要点1. QoS是什么发布者和订阅者之间的“服务约定”2. 谁定的架构师在设计阶段定写在设计文档里3. 怎么生效发布者和订阅者分别指定DDS检查兼容性4. 最常用的QoS策略可靠性RELIABLE vs BEST_EFFORT优先级HIGH vs NORMAL延迟预算1ms vs 100ms持久性TRANSIENT_LOCAL vs VOLATILE历史记录KEEP_LAST vs KEEP_ALL5. 一句话总结刹车指令RELIABLE HIGH 1ms VOLATILE摄像头图像BEST_EFFORT NORMAL 100ms KEEP_LAST(1)写在最后郭靖合上笔记本“QoS是发布者和订阅者之间的服务约定。可靠性决定丢不丢数据优先级决定能不能插队延迟预算决定超时要不要持久性决定晚来的能不能补。刹车指令和摄像头图像的QoS完全不一样各有各的配置。”黄蓉咬了口糖葫芦“全明白了”郭靖点头“明白了。刹车用RELIABLE插队视频用BEST_EFFORT排队。QoS搞错了轻则性能差重则收不到数据。”黄蓉眨眨眼“DDS从概念到报文到发现到QoS你算是完整过了一遍。那你知道QoS在DDS数据帧中是如何实现内连以及哪些字段、如何体现的吗”郭靖摇头。黄蓉眨眨眼“那就下期分解”打完收工886。