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(10)
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