Aller au contenu principal

Architecture de HDDS

HDDS suit une architecture en couches concue pour la performance, la modularite et la conformite aux standards.

Vue d'ensemble des couches

+---------------------------------------------------------+
| Couche Application |
| (Votre application Rust/C/C++/Python) |
+---------------------------------------------------------+
| Couche DCPS |
| DomainParticipant | Publisher | Subscriber | Topic | QoS|
+---------------------------------------------------------+
| Couche RTPS |
| Discovery (SPDP/SEDP) | Writers | Readers | History |
+---------------------------------------------------------+
| Couche Transport |
| UDP Multicast | UDP Unicast | Shared Memory |
+---------------------------------------------------------+

Couche DCPS (Data-Centric Publish-Subscribe)

La couche DCPS fournit l'API DDS avec laquelle les applications interagissent :

EntiteRole
DomainParticipantPoint d'entree, possede toutes les autres entites
PublisherRegroupe les DataWriters, applique des QoS communes
SubscriberRegroupe les DataReaders, applique des QoS communes
TopicCanal de donnees nomme avec un type
DataWriterEcrit des echantillons sur un Topic
DataReaderLit des echantillons depuis un Topic

Hierarchie des entites

DomainParticipant
+-- Publisher
| +-- DataWriter<SensorData>
| +-- DataWriter<Command>
+-- Subscriber
| +-- DataReader<SensorData>
| +-- DataReader<Status>
+-- Topic
+-- "SensorTopic"
+-- "CommandTopic"

Couche RTPS (Real-Time Publish-Subscribe)

La couche RTPS implemente le protocole filaire pour l'interoperabilite :

RTPS Writers et Readers

+------------------+     Protocole RTPS      +------------------+
| RTPS Writer | ----------------------> | RTPS Reader |
| | | |
| +------------+ | DATA, HEARTBEAT | +------------+ |
| | History | | ---------------------> | | History | |
| | Cache | | | | Cache | |
| +------------+ | ACKNACK, GAP | +------------+ |
| | <--------------------- | |
+------------------+ +------------------+

History Cache

Chaque Writer et Reader maintient un History Cache :

  • Writer History : Stocke les echantillons jusqu'a l'acquittement
  • Reader History : Stocke les echantillons recus jusqu'a leur consommation
use hdds::QoS;

// History depth controlled by QoS
let qos = QoS::reliable().keep_last(100);

Architecture de la decouverte

La decouverte utilise deux protocoles s'executant sur des endpoints integres :

+---------------------------------------------------------+
| DomainParticipant |
+----------------------------+----------------------------+
| SPDP (Participants) | SEDP (Endpoints) |
| | |
| BuiltinParticipant | BuiltinPublications |
| Writer/Reader | Writer/Reader |
| | |
| Multicast: 239.255.x.x | BuiltinSubscriptions |
| Port: 7400 + offset | Writer/Reader |
+----------------------------+----------------------------+

Flux de decouverte

1. Annonce SPDP (multicast)
Participant A --> 239.255.0.1:7400 --> Participant B

2. Echange SEDP (unicast)
A.Publications ------> B (infos endpoints)
A <------ B.Publications (infos endpoints)

3. Appariement
A.Writer apparie avec B.Reader (QoS compatibles)

4. Flux de donnees utilisateur
A.Writer --> DATA --> B.Reader

Couche Transport

HDDS supporte plusieurs transports :

TransportCas d'usageLatence
UDP MulticastDiscovery, multi-SubscriberMoyenne
UDP UnicastPoint a point, WANMoyenne
Shared MemoryMeme hote, haute performanceFaible (~1 us)

Selection du transport

let config = ParticipantConfig::default()
.transport(Transport::UdpMulticast) // Default
.transport(Transport::SharedMemory); // Add SHM

Modele de threading

HDDS utilise un runtime async avec des threads dedies :

+---------------------------------------------------------+
| Threads utilisateur |
| (write(), take(), create_reader(), etc.) |
+---------------------------------------------------------+
| Runtime HDDS |
| +-------------+ +-------------+ +------------------+ |
| | Discovery | | Pool I/O | | Timer/Scheduler | |
| | Thread | | (tokio) | | | |
| +-------------+ +-------------+ +------------------+ |
+---------------------------------------------------------+
  • Threads utilisateur : Les appels applicatifs sont non-bloquants autant que possible
  • Thread Discovery : Gere le protocole SPDP/SEDP
  • Pool I/O : Operations reseau async (basees sur tokio)
  • Thread Timer : Heartbeats, deadlines, liveliness

Architecture memoire

Chemin zero-copy

Pour les scenarios haute performance, HDDS supporte le zero-copy :

// Standard path (copy)
writer.write(&sample)?;

// Zero-copy path (loan buffer)
let mut loan = writer.loan_sample()?;
*loan = sample;
loan.write()?; // No copy to internal buffer

Gestion des buffers

+-----------------+    +-----------------+    +-----------------+
| Buffer utilisa-| | History Cache | | Buffer reseau |
| teur | -> | (par Writer) | -> | (par envoi) |
+-----------------+ +-----------------+ +-----------------+

Les limites de ressources empechent une croissance memoire non bornee :

use hdds::QoS;

let qos = QoS::reliable()
.max_samples(10000)
.max_instances(100)
.max_samples_per_instance(100);

Flux de donnees

Chemin d'ecriture

1. L'application appelle writer.write(&sample)
2. L'echantillon est serialise (CDR2/XCDR2)
3. Ajoute au History Cache du Writer
4. Encapsule dans un sous-message RTPS DATA
5. Envoye via le transport (UDP/SHM)
6. Acquitte (si reliable)
7. Retire de l'historique (si acquitte)

Chemin de lecture

1. Le reseau recoit un paquet RTPS
2. Analyse des sous-messages (DATA, HEARTBEAT, etc.)
3. Deserialisation de l'echantillon
4. Ajout au History Cache du Reader
5. Envoi d'ACKNACK (si reliable)
6. L'application appelle reader.take()
7. L'echantillon est retire de l'historique

Structure des modules

hdds/
+-- dcps/ # API DDS (Participant, Publisher, etc.)
+-- rtps/ # Implementation du protocole RTPS
| +-- writer.rs # Machine a etats RTPS Writer
| +-- reader.rs # Machine a etats RTPS Reader
| +-- discovery/ # SPDP et SEDP
| +-- messages/ # Types de messages RTPS
+-- transport/ # Transports reseau
| +-- udp.rs
| +-- shm.rs
+-- serialization/ # Codecs CDR/XCDR2
+-- qos/ # Implementations des politiques QoS

Caracteristiques de performance

OperationLatence typique
write() vers le reseau5-50 us
Reseau vers take()10-100 us
Aller-retour Shared Memory1-5 us
Discovery (demarrage a froid)100-500 ms

Prochaines etapes