Skip to main content

QoS Policies Overview

DDS provides 22 Quality of Service policies to fine-tune data distribution behavior. HDDS implements all standard policies from DDS v1.4.

Most Important Policies​

PolicyDescriptionDefault
ReliabilityDelivery guaranteeBEST_EFFORT
DurabilityData persistenceVOLATILE
HistorySample bufferingKEEP_LAST(100)
DeadlineUpdate frequencyInfinite
LivelinessFailure detectionAUTOMATIC

All 22 QoS Policies​

Data Distribution​

PolicyPurpose
ReliabilityBEST_EFFORT vs RELIABLE delivery
HistoryKEEP_LAST(n) vs KEEP_ALL buffering
DurabilityVOLATILE, TRANSIENT_LOCAL, PERSISTENT
DurabilityServiceLate-joiner delivery configuration
ResourceLimitsMax samples, instances, memory

Timing​

PolicyPurpose
DeadlineMaximum time between samples
LatencyBudgetAcceptable delay hint
LifespanData expiration time
TimeBasedFilterMinimum separation between samples

Ownership​

PolicyPurpose
OwnershipSHARED vs EXCLUSIVE writer control
OwnershipStrengthPriority for exclusive ownership

Ordering​

PolicyPurpose
DestinationOrderBY_RECEPTION_TIMESTAMP vs BY_SOURCE_TIMESTAMP
PresentationCoherent/ordered access scope

Lifecycle​

PolicyPurpose
LivelinessAUTOMATIC, MANUAL_BY_PARTICIPANT, MANUAL_BY_TOPIC
WriterDataLifecycleAuto-dispose unregistered instances
ReaderDataLifecycleAuto-purge samples without writers
EntityFactoryAuto-enable child entities

Metadata​

PolicyPurpose
UserDataCustom user metadata
TopicDataTopic-level metadata
GroupDataPublisher/Subscriber metadata
PartitionLogical data separation
TransportPriorityNetwork QoS hint

Quick Start​

use hdds::{Participant, QoS, TransportMode};

let participant = Participant::builder("my_app")
.domain_id(0)
.with_transport(TransportMode::UdpMulticast)
.build()?;

// Create writer with fluent QoS builder
let writer = participant
.topic::<SensorData>("sensors/temperature")?
.writer()
.qos(QoS::reliable().keep_last(10).transient_local())
.build()?;

QoS Presets​

HDDS provides built-in presets for common scenarios:

use hdds::{Participant, QoS, TransportMode};

let participant = Participant::builder("my_app")
.domain_id(0)
.with_transport(TransportMode::UdpMulticast)
.build()?;

// Low latency (gaming, real-time control)
let writer = participant
.topic::<ControlData>("control/commands")?
.writer()
.qos(QoS::best_effort().keep_last(1))
.build()?;

// High throughput (bulk data transfer)
let writer = participant
.topic::<BulkData>("data/transfer")?
.writer()
.qos(QoS::best_effort().keep_last(1000))
.build()?;

// Reliable (guaranteed delivery with caching)
let writer = participant
.topic::<StateData>("state/updates")?
.writer()
.qos(QoS::reliable().keep_last(100).transient_local())
.build()?;

QoS Compatibility​

Writers and readers must have compatible QoS to communicate:

WriterReaderResult
reliable()reliable()Match
reliable()best_effort()Match
best_effort()reliable()No Match
best_effort()best_effort()Match
Compatibility

A BEST_EFFORT writer cannot satisfy a RELIABLE reader. The reader expects acknowledgments that the writer won't send.

Fluent Builder API​

HDDS uses a fluent builder pattern for QoS configuration:

use hdds::QoS;

// Start with a preset
let qos = QoS::reliable()
.keep_last(100) // History: keep last 100 samples
.transient_local(); // Durability: cache for late joiners

// Or start from scratch
let qos = QoS::best_effort()
.keep_last(1) // Minimal history
.volatile(); // No caching

Available Methods​

MethodDescription
QoS::reliable()Guaranteed delivery with ACK/NACK
QoS::best_effort()Fire and forget
.keep_last(n)Keep last N samples per instance
.keep_all()Keep all samples
.volatile()No persistence
.transient_local()In-memory cache for late joiners
.persistent()Disk persistence

Next Steps​