QoS Cheatsheet
Quick reference for all 22 DDS QoS policies.
Data Distribution
| Policy | Values | Default | Compatibility |
|---|---|---|---|
| Reliability | BestEffort, Reliable | BestEffort | Exact match |
| History | KeepLast(N), KeepAll | KeepLast(100) | N/A |
| Durability | Volatile, TransientLocal, Persistent | Volatile | Writer >= Reader |
| DurabilityService | Cleanup delay, history depth, limits | - | N/A |
| ResourceLimits | max_samples, max_instances, max_quota_bytes | Unlimited | N/A |
Timing
| Policy | Values | Default | Compatibility |
|---|---|---|---|
| Deadline | Duration | Infinite | Writer ≤ Reader |
| LatencyBudget | Duration | 0 | Hint only |
| Lifespan | Duration | Infinite | Writer >= Reader |
| TimeBasedFilter | Duration | 0 | Hint only |
Ownership
| Policy | Values | Default | Compatibility |
|---|---|---|---|
| Ownership | Shared, Exclusive | Shared | Exact match |
| OwnershipStrength | Integer | 0 | N/A |
Ordering
| Policy | Values | Default | Compatibility |
|---|---|---|---|
| DestinationOrder | ByReception, BySource | ByReception | Writer >= Reader |
| Presentation | Instance, Topic, Group | Instance | Writer >= Reader |
Lifecycle
| Policy | Values | Default | Compatibility |
|---|---|---|---|
| Liveliness | Automatic, ManualByParticipant, ManualByTopic | Automatic | Writer >= Reader |
| WriterDataLifecycle | autodispose_unregistered | true | N/A |
| ReaderDataLifecycle | autopurge delays | Infinite | N/A |
| EntityFactory | autoenable | true | N/A |
Metadata
| Policy | Values | Default | Compatibility |
|---|---|---|---|
| UserData | Bytes | Empty | Hint only |
| TopicData | Bytes | Empty | Hint only |
| GroupData | Bytes | Empty | Hint only |
| Partition | String list | Empty (default) | Intersection |
| TransportPriority | Integer | 0 | Hint only |
Common Profiles
Sensor Streaming (High Rate)
let qos = DataWriterQos::default()
.reliability(Reliability::BestEffort)
.durability(Durability::Volatile)
.history(History::KeepLast { depth: 1 });
State Synchronization
let qos = DataWriterQos::default()
.reliability(Reliability::Reliable {
max_blocking_time: Duration::from_secs(1),
})
.durability(Durability::TransientLocal)
.history(History::KeepLast { depth: 10 });
Command Queue
let qos = DataWriterQos::default()
.reliability(Reliability::Reliable {
max_blocking_time: Duration::from_secs(30),
})
.durability(Durability::Volatile)
.history(History::KeepAll);
Event Log
let qos = DataWriterQos::default()
.reliability(Reliability::Reliable {
max_blocking_time: Duration::from_secs(5),
})
.durability(Durability::Persistent)
.history(History::KeepAll);
Compatibility Matrix
Reliability
| Writer | Reader | Match |
|---|---|---|
| Reliable | Reliable | ✅ |
| Reliable | BestEffort | ✅ |
| BestEffort | BestEffort | ✅ |
| BestEffort | Reliable | ❌ |
Durability
| Writer | Reader | Match |
|---|---|---|
| Persistent | Any | ✅ |
| TransientLocal | TransientLocal/Volatile | ✅ |
| TransientLocal | Persistent | ❌ |
| Volatile | Volatile | ✅ |
| Volatile | TransientLocal/Persistent | ❌ |
Liveliness
| Writer | Reader | Match |
|---|---|---|
| ManualByTopic | Any | ✅ |
| ManualByParticipant | ManualByParticipant/Automatic | ✅ |
| ManualByParticipant | ManualByTopic | ❌ |
| Automatic | Automatic | ✅ |
| Automatic | Manual* | ❌ |
Quick Reference
Writer QoS
DataWriterQos::default()
.reliability(Reliability::Reliable { max_blocking_time })
.durability(Durability::TransientLocal)
.history(History::KeepLast { depth: 100 })
.deadline(Deadline::new(Duration::from_millis(100)))
.liveliness(Liveliness::Automatic { lease_duration })
.ownership(Ownership::Shared)
.resource_limits(ResourceLimits { ... })
Reader QoS
DataReaderQos::default()
.reliability(Reliability::Reliable)
.durability(Durability::TransientLocal)
.history(History::KeepLast { depth: 50 })
.deadline(Deadline::new(Duration::from_millis(200)))
.time_based_filter(TimeBasedFilter::from_millis(10))
Publisher/Subscriber QoS
PublisherQos::default()
.partition(Partition::single("sensor"))
.presentation(Presentation::topic_coherent())
Participant QoS
DomainParticipantQos::default()
.user_data(UserData::new(b"version=1.0".to_vec()))