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::prelude::*;

// Create QoS with builder pattern
let writer_qos = DataWriterQos::default()
.reliability(Reliability::Reliable {
max_blocking_time: Duration::from_secs(1),
})
.durability(Durability::TransientLocal)
.history(History::KeepLast { depth: 10 });

let writer = publisher.create_writer_with_qos(&topic, writer_qos)?;

QoS Profiles

HDDS provides built-in profiles for common scenarios:

// Low latency (gaming, real-time control)
let qos = QosProfile::low_latency();
// → KeepLast(1), 100KB quota

// High throughput (bulk data transfer)
let qos = QosProfile::high_throughput();
// → KeepLast(1000), 50MB quota

// Reliable (guaranteed delivery)
let qos = QosProfile::reliable();
// → Reliable, TransientLocal, KeepLast(100)

QoS Compatibility

Writers and readers must have compatible QoS to communicate:

WriterReaderResult
RELIABLERELIABLEMatch
RELIABLEBEST_EFFORTMatch
BEST_EFFORTRELIABLENo Match
BEST_EFFORTBEST_EFFORTMatch
Compatibility

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

Resource Limits

Control memory usage with ResourceLimits:

let qos = DataWriterQos::default()
.resource_limits(ResourceLimits {
max_samples: 100_000, // Total samples
max_instances: 1, // Number of instances
max_samples_per_instance: 100_000, // Per-instance queue
max_quota_bytes: 100 * 1024 * 1024, // 100 MB
});

Next Steps