Fast DDS 架构分析


  团队博客: 汽车电子社区


1. 项目概述

1.1 基本信息

  - 项目名称: Fast DDS (原eProsima Fast-RTPS)
  
- 维护组织: eProsima
  - 开源许可: Apache License 2.0
  
- 主要语言: C++11/14/17
  - 版本: 3.4.1.0
  
- 构建系统: CMake 3.20+

1.2 设计理念

  *Fast DDS采用现代C++设计,追求功能完整性和易用性,同时保持高性能,适合企业级和通用DDS应用。

2. 整体架构设计

2.1 分层架构

┌─────────────────────────────────────┐
│        DDS用户应用程序层              │
├─────────────────────────────────────┤
│       Fast DDS C++ API层             │
├─────────────────────────────────────┤
│       DDS核心服务层                   │
├─────────────────────────────────────┤
│       RTPS协议层                     │
├─────────────────────────────────────┤
│       传输层                         │
├─────────────────────────────────────┤
│       网络和操作系统层                │
└─────────────────────────────────────┘

2.2 目录结构分析

src/cpp/
├── fastdds/               # DDS层实现
│   ├── builtin/          # 内置主题支持
│   ├── core/             # 核心实体管理
│   ├── domain/           # 域管理 (83.38KB)
│   ├── log/              # 日志系统
│   ├── publisher/        # 发布者实现
│   ├── subscriber/       # 订阅者实现
│   ├── topic/            # 主题管理
│   └── xtypes/           # 动态类型支持
├── rtps/                 # RTPS协议实现
│   ├── builtin/          # 内置协议
│   ├── history/          # 历史缓存
│   ├── messages/         # 消息处理
│   ├── participant/      # RTPS参与者 (115.42KB)
│   ├── reader/           # 读取器实现 (56.99KB)
│   ├── transport/        # 传输层 (74.94KB)
│   └── writer/           # 写入器实现 (83.36KB)
├── security/             # 安全模块 (167.72KB)
├── statistics/           # 统计模块
├── utils/                # 工具类
└── xmlparser/            # XML配置解析

3. 核心模块详细分析

3.1 域管理层 (fastdds/domain/)

  * 域参与者实现 (DomainParticipantImpl.cpp - 83.38KB)

class DomainParticipantImpl : public DomainParticipant
{
public:
    // 参与者创建和初始化
    DomainParticipantImpl(
        DomainParticipantFactory* factory,
        const DomainParticipantQos& qos,
        DomainParticipantListener* listener,
        const StatusMask& mask);

    // 核心生命周期管理
    ReturnCode_t enable() override;
    ReturnCode_t disable() override;

    // 实体创建工厂
    Publisher* create_publisher(
        const PublisherQos& qos,
        PublisherListener* listener,
        const StatusMask& mask) override;

    Subscriber* create_subscriber(
        const SubscriberQos& qos,
        SubscriberListener* listener,
        const StatusMask& mask) override;

private:
    // 内部状态管理
    ParticipantAttributes attributes_;
    std::unique_ptr<RTPSParticipantImpl> rtps_participant_;
};

  *域工厂实现 (DomainParticipantFactory.cpp - 20.55KB)

class DomainParticipantFactory
{
public:
    // 全局单例模式
    static DomainParticipantFactory* get_instance();

    // 域参与者创建
    DomainParticipant* create_participant(
        DomainId_t domain_id,
        const DomainParticipantQos& qos,
        DomainParticipantListener* listener,
        const StatusMask& mask);

    // QoS管理
    ReturnCode_t set_default_participant_qos(const DomainParticipantQos& qos);
    ReturnCode_t get_default_participant_qos(DomainParticipantQos& qos);

private:
    // 工厂配置
    DomainParticipantFactoryQos factory_qos_;
};

3.2 RTPS协议层 (rtps/)

  *RTPS参与者实现 (participant/RTPSParticipantImpl.cpp - 115.42KB)

class RTPSParticipantImpl
{
public:
    // RTPS参与者创建
    RTPSParticipantImpl(
        const ParticipantAttributes& att,
        GuidPrefix_t guid_prefix);

    // 端点管理
    Reader* create_reader(
        ReaderAttributes& att,
        const GUID_t& guid,
        TopicAttributes& topic_att,
        ReaderListener* listen);

    Writer* create_writer(
        WriterAttributes& att,
        const GUID_t& guid,
        TopicAttributes& topic_att,
        WriterListener* listen);

    // 状态机管理
    void assert_remote_participant_liveliness(
        const GuidPrefix_t& guid_prefix);

private:
    // 内部组件
    std::unique_ptr<MessageReceiver> message_receiver_;
    std::unique_ptr<ResourceManager> resource_manager_;
    BuiltinProtocols builtin_protocols_;
};

  有状态写入器 (writer/StatefulWriter.cpp - 83.36KB)

class StatefulWriter : public Writer
{
public:
    // 数据写入核心逻辑
    bool write_sample(
        const Change_t& change);

    // 可靠性管理
    void perform_send_heartbeat();
    void perform_ack_nack_management();

    // 匹配管理
    void matched_reader_add(const ReaderProxyData& data);
    void matched_reader_remove(const GUID_t& reader_guid);

private:
    // 状态管理
    std::vector<ReaderProxy> matched_readers_;
    std::unique_ptr<HistoryCache> history_cache_;
};

   有状态读取器 (reader/StatefulReader.cpp - 56.99KB)

class StatefulReader : public Reader
{
public:
    // 数据接收处理
    bool read_next_data(
        void* data,
        SampleInfo_t* info);

    // 可靠性处理
    void send_ack_nack(const SequenceNumberSet_t& missing);
    void process_heartbeat(const GUID_t& writer_guid);

private:
    // 匹配写入器管理
    std::vector<WriterProxy> matched_writers_;
    std::unique_ptr<HistoryCache> history_cache_;
};

3.3 传输层实现 (rtps/transport/)

  TCP传输接口 (TCPTransportInterface.cpp - 74.94KB)

class TCPTransportInterface : public TransportInterface
{
public:
    // 连接管理
    virtual bool open_input_channel(
        const Locator_t& locator,
        uint32_t max_msg_size) override;

    virtual bool open_output_channel(
        const Locator_t& locator) override;

    // 数据传输
    virtual bool send(
        const octet* data,
        uint32_t size,
        const Locator_t& destination) override;

    virtual bool receive(
        octet* data,
        uint32_t& size,
        const Locator_t& source) override;

private:
    // TCP特定实现
    std::map<Locator_t, TCPChannel*> channels_;
    std::unique_ptr<TCPAcceptor> acceptor_;
};

3.4 安全模块 (security/)

  安全管理器 (SecurityManager.cpp - 167.72KB)

class SecurityManager
{
public:
    // 认证管理
    bool authenticate_remote_participant(
        const ParticipantAuthMessage& msg,
        const GUID_t& remote_guid);

    // 访问控制
    bool check_permissions(
        const GUID_t& local_guid,
        const GUID_t& remote_guid,
        const DataTagQos& data_tag);

    // 加密解密
    bool encrypt_message(
        const CryptoContent& plain,
        CryptoContent& encrypted);

    bool decrypt_message(
        const CryptoContent& encrypted,
        CryptoContent& plain);

private:
    // 安全组件
    std::unique_ptr<Authentication> authentication_;
    std::unique_ptr<AccessControl> access_control_;
    std::unique_ptr<Cryptography> cryptography_;
};

4. 调用流程分析

4.1 数据发布流程

应用程序调用
    ↓
DataWriter::write()
    ↓
StatefulWriter::write_sample()
    ↓
HistoryCache::add_change()
    ↓
RTPSMessageSender::send_change()
    ↓
TransportInterface::send()
    ↓
网络发送

4.2 数据订阅流程

网络接收
    ↓
MessageReceiver::process_message()
    ↓
StatefulReader::process_data()
    ↓
HistoryCache::add_received_change()
    ↓
DataReader::take_next_sample()
    ↓
应用程序回调

4.3 发现流程

DomainParticipant创建
    ↓
BuiltinProtocols::init()
    ↓
PDPServer::init()
    ↓
ParticipantDiscovery::announce()
    ↓
EndpointDiscovery::discovery()
    ↓
匹配建立
    ↓
数据通信

5. 关键算法实现

5.1 发现算法

  - PDP (Participant Discovery Protocol): 基于XML配置的发现
  - EDP (Endpoint Discovery Protocol): 端点匹配算法
  - 实现位置: rtps/builtin/discovery/

5.2 流控制算法

// 流控制实现
void StatefulWriter::perform_flow_control()
{
    // 速率限制
    if (data_rate_exceeded())
    {
        apply_throttling();
    }
    
    // 背压管理
    if (receiver_buffer_full())
    {
        apply_backpressure();
    }
}

5.3 内存管理算法

// 定制内存分配器
template<typename T>
class FastDDSAllocator
{
public:
    T* allocate(size_t n)
    {
        return memory_pool_->allocate(n * sizeof(T));
    }
    
    void deallocate(T* ptr, size_t n)
    {
        memory_pool_->deallocate(ptr);
    }
};

6. 设计模式应用

6.1 工厂模式

  - DomainParticipantFactory: 创建域参与者
  - PublisherFactory: 创建发布者
  - TopicFactory: 创建主题

6.2 观察者模式

  - Listener机制: 状态变化通知
  - EventHandler: 异步事件处理

6.3 策略模式

  - QoS策略: 可配置的QoS实现
  - Transport策略: 多种传输方式

6.4 单例模式

  - DomainParticipantFactory: 全局工厂
  - LogConsumer: 日志管理

7. 配置系统

7.1 XML配置解析

<!-- Fast DDS配置示例 -->
<profiles>
    <participant profile_name="default_profile">
        <rtps>
            <builtin>
                <discovery_config>
                    <discoveryProtocol>SERVER</discoveryProtocol>
                    <serverId>0</serverId>
                </discovery_config>
            </builtin>
        </rtps>
    </participant>
</profiles>

7.2 动态QoS配置

// QoS动态配置
PublisherQos pub_qos;
publisher->get_qos(pub_qos);
pub_qos.deadline().period = Duration_t(1, 0);
publisher->set_qos(pub_qos);

8. 扩展性设计

8.1 插件架构

// 传输插件接口
class TransportPlugin
{
public:
    virtual bool init() = 0;
    virtual bool send(const Message& msg) = 0;
    virtual bool receive(Message& msg) = 0;
};

8.2 自定义序列化

// 序列化插件
class SerializationPlugin
{
public:
    virtual bool serialize(const void* data, size_t size, SerializedData& output) = 0;
    virtual bool deserialize(const SerializedData& input, void*& data, size_t& size) = 0;
};

9. 工具链分析

9.1 快捷工具

  - shapes-demo: 可视化DDS演示
  - monitor: 实时监控工具
  - performance-test: 性能测试套件

9.2 调试支持

  - 详细日志: 分级日志系统
  - 统计监控: 实时性能统计
  - 调试工具: 内存泄漏检测

10. 性能优化特性

10.1 内存优化

  - 对象池: 预分配对象避免new/delete
  - 内存对齐: 缓存行对齐优化
  - 零拷贝: 关键路径避免拷贝

10.2 网络优化

  - 批量发送: 消息聚合减少系统调用
  - UDP优化: 自定义UDP缓冲区管理
  - 共享内存: 本地通信优化

10.3 并发优化

  - 无锁队列: 线程间消息传递
  - 原子操作: 状态更新优化
  - 线程池: 专用处理线程

11. 应用场景分析

11.1 适用场景

  - 企业级应用: 需要完整DDS功能
  - 复杂系统: 多层次QoS需求
  - 原型开发: 快速开发和迭代
  - 教学研究: 丰富的文档和示例

11.2 技术优势

  - 功能完整: 最全面的DDS实现
  - 易用性强: 现代C++设计
  - 工具丰富: 完整的工具链
  - 社区活跃: 持续更新维护

12. 总结

  Fast DDS以其现代C++设计、完整功能实现和丰富工具链成为最受欢迎的DDS实现之一。其优秀的架构设计和扩展性,特别适合需要完整功能和易用性的企业级应用。

关键优势

  1. 功能最全: 完整的DDS规范实现
  2. 设计现代: 现代C++最佳实践
  3. 工具丰富: 完整的开发工具链
  4. 扩展性强: 插件化架构设计

注意事项

  1. 学习成本: C++复杂度较高
  2. 资源占用: 相对C实现较大
  3. 编译时间: 模板化设计增加编译时间

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值