fastdds.ignore_local_endpoints 属性

Fast DDS 的 fastdds.ignore_local_endpoints 属性用于控制同一 DomainParticipant 下的本地端点(即 DataWriter 和 DataReader)是否自动匹配。以下是对该功能的详细解释,并翻译为中文,结合其上下文、实现原理和使用场景,确保清晰易懂。


一、背景与问题描述

在 Fast DDS(或其他 DDS 实现)中,默认情况下,当一个 DomainParticipant 内的 DataReader 和 DataWriter 订阅或发布在同一个 Topic 上,并且它们的 QoS(服务质量)配置兼容时,它们会自动匹配。这意味着 DataWriter 发布的数据会被同一 DomainParticipant 内的 DataReader 接收,形成一种“反馈循环”(feedback loop)。

问题

  • 这种本地匹配可能导致不必要的复杂性。例如,一个应用程序可能在同一 DomainParticipant 下同时创建了一个 DataWriter 和一个 DataReader,它们共享同一个 Topic。在这种情况下,DataWriter 发送的数据会被本地 DataReader 接收,即使这些数据本意是发送给其他远程 DomainParticipant 的。
  • 如果应用程序不希望本地端点之间通信,开发者需要在 DataReader 的监听器(DataReaderListener)中通过检查数据的 GuidPrefix_t(标识发送者的唯一前缀)来过滤掉来自同一 DomainParticipant 的消息。这种过滤逻辑会增加应用程序的复杂性,并且数据仍需经过整个接收流程(从网络层到应用层),才被丢弃,造成资源浪费。

解决方法

  • Fast DDS 提供了 fastdds.ignore_local_endpoints 属性,允许开发者禁止同一 DomainParticipant 内的本地端点(DataWriter 和 DataReader)进行匹配,从而避免上述问题。

二、fastdds.ignore_local_endpoints 属性详解

属性说明
  • 属性名称:fastdds.ignore_local_endpoints
  • 属性值
    • "true":禁止同一 DomainParticipant 内的本地端点匹配。DataWriter 和 DataReader 即使在同一 Topic 上且 QoS 兼容,也不会相互匹配。
    • "false":允许本地端点匹配(默认行为)。
  • 默认值:"false",即默认情况下本地端点会自动匹配。
  • 作用范围:该属性应用于 DomainParticipant 的 PropertyPolicyQos,影响该 DomainParticipant 内的所有 DataWriter 和 DataReader。
  • 配置方式
    • 可通过 C++ API 或 XML 配置文件设置。
实现原理
  • Fast DDS 使用 RTPS(Real-Time Publish-Subscribe)协议管理端点匹配。当 fastdds.ignore_local_endpoints 设置为 "true" 时,Fast DDS 的内部匹配逻辑会跳过同一 DomainParticipant 内的 DataWriter 和 DataReader 的匹配检查。
  • 具体来说,Fast DDS 在端点发现阶段(Discovery Phase)会检查 GuidPrefix_t(标识 DomainParticipant 的唯一前缀)。如果发现 DataWriter 和 DataReader 属于同一 DomainParticipant,且该属性为 "true",则不会将它们加入彼此的匹配列表。
  • 这避免了本地数据通过 RTPS 协议的传输和处理,减少了不必要的网络和 CPU 开销。
优势
  1. 简化应用逻辑:无需在 DataReaderListener 中手动过滤本地数据,降低应用程序复杂度。
  2. 性能优化:数据不会被发送到本地 DataReader,减少了不必要的处理开销。
  3. 明确语义:明确区分本地和远程通信,适合需要严格隔离本地端点通信的场景。
局限性
  • 如果应用程序确实需要本地端点通信(例如用于测试或调试),设置 "true" 会阻止这种行为。
  • 配置为 "true" 后,同一 DomainParticipant 内的 DataWriter 和 DataReader 无法通信,即使这是预期的行为。
无效值处理
  • 如果设置了无效值(如非 "true" 或 "false" 的值),Fast DDS 会回退到默认行为(即 "false",允许本地端点匹配)。

三、配置示例

以下是如何在 Fast DDS 中配置 fastdds.ignore_local_endpoints 的两种方式:

1. 通过 C++ API 配置

cpp

#include <fastdds/dds/domain/DomainParticipantFactory.hpp>

#include <fastdds/dds/domain/DomainParticipant.hpp>

using namespace eprosima::fastdds::dds;

int main() {

DomainParticipantQos pqos;

// 设置属性以忽略本地端点匹配

pqos.properties().properties().emplace_back(

"fastdds.ignore_local_endpoints", "true"

);

// 创建 DomainParticipant

DomainParticipant* participant =

DomainParticipantFactory::get_instance()->create_participant(0, pqos);

// 继续创建 DataWriter 和 DataReader

// ...

return 0;

}

2. 通过 XML 配置文件

xml

<?xml version="1.0" encoding="UTF-8" ?>

<dds xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">

<profiles>

<participant profile_name="ignore_local_endpoints_domainparticipant_xml_profile">

<rtps>

<propertiesPolicy>

<properties>

<!-- 忽略本地端点匹配 -->

<property>

<name>fastdds.ignore_local_endpoints</name>

<value>true</value>

</property>

</properties>

</propertiesPolicy>

</rtps>

</participant>

</profiles>

</dds>

加载 XML 配置文件:

cpp

#include <fastdds/dds/domain/DomainParticipantFactory.hpp>

using namespace eprosima::fastdds::dds;

int main() {

DomainParticipantFactory::get_instance()->load_profiles();

DomainParticipant* participant =

DomainParticipantFactory::get_instance()->create_participant(

0, PARTICIPANT_QOS_DEFAULT, nullptr, StatusMask::all(),

"ignore_local_endpoints_domainparticipant_xml_profile"

);

// 继续创建 DataWriter 和 DataReader

// ...

return 0;

}


四、适用场景

  1. 分布式系统中的数据隔离
    • 在分布式系统中,一个 DomainParticipant 可能同时包含 DataWriter 和 DataReader,但只希望与远程 DomainParticipant 通信。例如,机器人系统中一个节点发布传感器数据,只需发送给其他节点,而不需要本地 DataReader 接收。
    • 配置:将 fastdds.ignore_local_endpoints 设为 "true"。
  2. 性能优化
    • 在高吞吐量场景中,避免本地端点匹配可以减少不必要的 RTPS 数据传输和处理。例如,实时视频流处理系统中,同一节点内的 DataReader 不需要接收本地 DataWriter 的数据。
    • 配置:结合 VOLATILE Durability 和 BEST_EFFORT Reliability,进一步优化性能。
  3. 简化应用程序逻辑
    • 当应用程序不希望处理本地数据过滤逻辑时,启用此属性可以直接在中间件层面阻止本地匹配,简化 DataReaderListener 的实现。
  4. 测试与调试例外
    • 如果需要测试本地端点通信(如在单一节点上模拟发布-订阅行为),应保持默认值 "false"。

五、注意事项

  1. QoS 兼容性不受影响
    • fastdds.ignore_local_endpoints 仅影响同一 DomainParticipant 内的端点匹配,不影响 QoS 兼容性检查(如 DurabilityQos、ReliabilityQos)。
    • 仍需确保 DataWriter 和 DataReader 的 QoS 配置(如 Durability、Reliability)与远程端点兼容。
  2. 调试匹配问题
    • 如果配置后发现 DataReader 未接收到预期数据,检查是否因 fastdds.ignore_local_endpoints 阻止了本地匹配。
    • 启用 Fast DDS 日志(fastdds.log 属性)或使用 Fast DDS Monitor 工具验证端点匹配状态。
  3. 与 Durability 模式的关系
    • 对于 VOLATILE 模式,忽略本地端点通常影响较小,因为数据本身不存储历史。
    • 对于 TRANSIENT_LOCAL、TRANSIENT 或 PERSISTENT 模式,忽略本地端点可避免不必要的历史数据传输。
  4. 默认行为适用性
    • 默认值 "false" 适合需要本地端点通信的场景,如单机测试或开发环境。
    • 在生产环境中,通常建议设置为 "true",以避免意外的本地数据反馈。

六、总结

fastdds.ignore_local_endpoints 属性是 Fast DDS 提供的一项功能,用于控制同一 DomainParticipant 内 DataWriter 和 DataReader 的匹配行为:

  • 值 "true":禁止本地端点匹配,适合分布式系统或需要隔离本地通信的场景,减少应用层过滤逻辑和性能开销。
  • 值 "false"(默认):允许本地端点匹配,适合测试或需要本地通信的场景。
  • 配置方式:通过 C++ API 或 XML 配置文件设置,作用于整个 DomainParticipant。
  • 适用场景:分布式系统、性能优化、简化应用程序逻辑。
  • 注意事项:确保配置值有效,检查匹配状态,结合其他 QoS(如 Durability)优化系统行为。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/93749.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/93749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

华清远见25072班C语言学习day11

重点内容:函数&#xff1a;定义&#xff1a;返回值类型 函数名(参数列表) { //函数体 }函数的参数列表中可以有多个数据返回值&#xff1a;如果函数没有返回值可以写成void 返回值的作用&#xff0c;函数的结果用来返回给主调函数的&#xff0c;如果主调函数处不需要函数的结果…

视觉语言导航(7)——VLN的数据集和评估方法 3.2

这是课上做的笔记&#xff0c;因此很多记得比较急&#xff0c;之后会逐步完善&#xff0c;每节课的逻辑流程写在大纲部分。成功率(SR)导航误差(NE)成功加权路径长度&#xff08;SucceedPLength&#xff09;轨迹长度&#xff08;TL&#xff09;先知成功率&#xff08;OS&#xf…

ElasticSearch不同环境同步索引数据

目的&#xff1a;在生产环境把一个索引的数据同步到测试环境中1、在生产环境导出json数据curl -u "adims_user:xkR%cHwR5I9g" -X GET "http://172.18.251.132:9200/unify_info_mb_sp_aggregatetb_0004/_search?scroll1m" -H Content-Type: applicatio…

咨询进阶——解读咨询顾问技能模型

适应人群为咨询行业从业者、咨询团队管理者、想提升咨询技能的职场人士及咨询公司培训人员。主要内容围绕咨询顾问技能模型展开,核心包括五大核心能力(解决问题能力,涵盖洞察力、分析技巧、问题构建等,从识别问题实质到构建新分析方法分层次阐述;管理能力,涉及管理他人与…

2025年- H98-Lc206--51.N皇后(回溯)--Java版

1.题目描述2.思路 二维数组集合 (1&#xff09;N皇后规则 1&#xff09;不能同行&#xff08;同一行不能出现2个皇后&#xff09; 2&#xff09;不能同列&#xff08;同一列不能出现2个皇后&#xff09; 3&#xff09;不能说45度或135度&#xff08;斜对角线不能出现2个皇后&am…

5G + AI + 云:电信技术重塑游戏生态与未来体验

在数字娱乐蓬勃发展的今天&#xff0c;游戏产业已然成为科技创新的前沿阵地。电信网络也经历了一场深刻的蜕变&#xff0c;从最初仅仅是 “内容传输管道”&#xff0c;摇身一变成为与游戏深度绑定的技术共生体。5G 不断刷新着体验的边界&#xff0c;AI 彻底颠覆传统的创作模式&…

【React Hooks】封装的艺术:如何编写高质量的 React 自-定义 Hooks

【React Hooks】封装的艺术&#xff1a;如何编写高质量的 React 自-定义 Hooks 所属专栏&#xff1a; 《前端小技巧集合&#xff1a;让你的代码更优雅高效》 上一篇&#xff1a; 【React State】告别 useState 滥用&#xff1a;何时应该选择 useReducer 作者&#xff1a; 码力…

华为GaussDB的前世今生:国产数据库崛起之路

在数据库领域&#xff0c;华为GaussDB已成为一颗耀眼的明星&#xff0c;为企业核心业务数字化转型提供坚实的数据底座。但这并非一蹴而就&#xff0c;其背后是长达二十余年的技术沉淀、战略投入与持续创新。本文将深入探寻华为GaussDB的历史沿革与核心技术细节&#xff0c;展现…

数据结构初阶(16)排序算法——归并排序

2.4 归并排序 归并排序&#xff08;Merge Sort&#xff09;是基于分治思想的经典排序算法。核心逻辑&#xff1a; 分而治之——把复杂排序问题拆分成简单子问题解决&#xff0c;再合并子问题的结果。联系链表的合并&#xff1a;两个有序链表l1、l2创建新链表l3&#xff08;带头…

MATLAB实现匈牙利算法求解二分图最大匹配

MATLAB实现匈牙利算法求解二分图最大匹配 匈牙利算法&#xff08;也称为Kuhn-Munkres算法&#xff09;是解决二分图最大匹配问题的经典算法。 代码 function [matching, max_match] hungarian_algorithm(adjMatrix)% HUNGARIAN_ALGORITHM 实现匈牙利算法求解二分图最大匹配% 输…

自定义table

更好<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"utf-8"><title>数据表格</title><style>* {margin: 0;padding: 0;box-sizing: border-box;font-size: 14px;}html,body {width: 100%;height: 100%…

面向R语言用户的Highcharts

如果您喜欢使用 R 进行数据科学创建交互式数据可视化&#xff0c;那么请你收藏。今天&#xff0c;我们将使用折线图、柱状图和散点图来可视化资产回报。对于我们的数据&#xff0c;我们将使用以下 5 只 ETF 的 5 年月回报率。 SPY (S&P500 fund)EFA (a non-US equities fun…

【测试工具】OnDo SIP Server--轻松搭建一个语音通话服务器

前言 Ondo SIP Server 是一款基于 SIP(Session Initiation Protocol)协议的服务器软件&#xff0c;主要用于实现 VoIP(Voice over IP)通信&#xff0c;支持语音通话、视频会议等多媒体会话管理&#xff0c;非常适合学习和测试VoIP的基本功能。本文介绍Ondo SIP Server的安装、…

疯狂星期四文案网第42天运营日记

网站运营第42天&#xff0c;点击观站&#xff1a; 疯狂星期四 crazy-thursday.com 全网最全的疯狂星期四文案网站 运营报告 今日访问量 今日搜索引擎收录情况 网站优化点 优化一些发现的seo错误 增加颜文字栏目 增加了一些tag

使用空模型实例调用辅助函数,确定在量化过程中哪些层会被跳过(43)

在Facebook的OPT-350M中,模型的头部(lm_head)与解码器的嵌入标记层(decoder.embed_tokens)共享其权重。 print(model.model.decoder.embed_tokens) print(model.lm_head)输出结果 Embedding(50272, 512

从0-1使用Fastmcp开发一个MCP服务,并部署到阿里云百炼 -持续更新中

目的&#xff1a; 在本地使用fastmcp开发一个mcp,然后注册到阿里云的百炼里面。实现在百炼里面创建智能体的时候直接引用自己开发的MCP 已完成&#xff1a;本地环境安装 待完成&#xff1a; 1.根据需求实现一个MCP中可以调用某应用的多个API即 mcp.tool()、mcp.prompt()、接入大…

设计模式之汇总

设计模式 零、设计原则 0.1 单一职责 0.2 接口隔离 0.3 开闭原则 0.4 依赖倒置0.5 迪米特法则&#xff0c;最小知道原则用户关机 只和朋友通信 朋友条件&#xff1a; 1&#xff09;当前对象本身&#xff08;this&#xff09; 2&#xff09;以参量形式传入到当前对象方法中的对象…

第6章 Decoder与Encoder核心组件

前言 Netty从底层Java通道读取ByteBuf二进制数据&#xff0c;传入Netty通道的流水线&#xff0c;随后开始入站处理。在入站处理过程中&#xff0c;需要将ByteBuf二进制类型解码成Java POJO对象。这个解码过程可以通过Netty的Decoder&#xff08;解码器&#xff09;去完成。 在…

[已解决]当启动 Spring Boot 应用时出现 Using generated security password xxx提示

当启动 Spring Boot 应用时出现 Using generated security password xxx提示当启动 Spring Boot 应用时出现 Using generated security password xxx提示&#xff0c;这是 Spring Security 自动配置的默认行为&#xff0c;通常发生在你​​未自定义安全配置​​但引入了 Spring…

自动分析需求,PRD 生成只需 SOLO 一步!

资料来源&#xff1a;火山引擎-开发者社区 写不清需求&#xff1f;PRD 难产&#xff1f;开发总跑偏&#xff1f;这些痛点&#xff0c;SOLO 来解决。 TRAE SOLO 是行业首个 Context Engineer。它不止协助编码&#xff0c;更能基于精准上下文理解和工具调用&#xff0c;从构思、…