RustDDS를 온전히 이해하기 위해서는 그 근간을 이루는 두 가지 핵심 기술, 즉 데이터 분산 서비스(DDS) 표준과 러스트(Rust) 프로그래밍 언어에 대한 선행적 고찰이 필수적이다. 이 두 기술의 융합은 RustDDS의 설계 철학, 기술적 장단점, 그리고 전략적 가치를 결정하는 핵심 요소로 작용한다.
데이터 분산 서비스(Data Distribution Service, DDS)는 객체 관리 그룹(Object Management Group, OMG)이 관리하는 기계 대 기계(M2M) 통신을 위한 미들웨어 표준이다.1 이 표준은 항공우주, 국방, 자율주행차, 로보틱스, 의료 기기 등 미션 크리티컬(mission-critical) 시스템에서 요구되는 확장 가능하고, 실시간성이 보장되며, 신뢰성 높은 고성능 데이터 교환을 목표로 설계되었다.2 2001년에 개발이 시작되어 여러 버전을 거치며 발전해 온 DDS는 그 성숙도와 안정성을 입증받은 기술이다.2
DDS의 근본적인 아키텍처 패러다임은 데이터 중심의 발행-구독 모델에 기반한다.
DDS API를 구성하는 핵심 객체는 다음과 같다.
DomainParticipant: 애플리케이션이 DDS 도메인(격리된 통신 공간)에 참여하기 위한 진입점이다.8Topic: 이름과 데이터 타입을 가지는 데이터 채널이다. With_Key와 No_Key 두 종류로 나뉜다. With_Key 토픽은 데이터베이스 테이블과 유사하게, 각 키(key)가 고유한 데이터 ‘인스턴스’(예: 특정 센서나 차량)를 식별하는 구조를 가진다.13Publisher 및 Subscriber: 각각 데이터 송신과 수신을 담당하는 엔티티다.13DataWriter 및 DataReader: 특정 토픽에 바인딩되어 애플리케이션이 데이터 샘플을 쓰고 읽는 데 사용하는 타입 지정 엔드포인트다.10서비스 품질(QoS)은 DDS의 핵심 기능으로, 통신 행위를 정교하게 제어하는 메커니즘이다.
DataReader가 특정 수준의 서비스를 ‘요청(request)’하고 DataWriter가 서비스 수준을 ‘제공(offer)’하는 ‘계약’ 모델에 있다. 통신은 오직 제공되는 서비스가 요청을 만족시킬 수 있을 때만 성립된다.16 호환되지 않는 QoS 설정은 분산 시스템에서 통신 실패의 주된 원인이 되므로, 디버깅 시 매우 중요한 고려 사항이다.16RELIABILITY: BEST_EFFORT(빠르지만 샘플 유실 가능)와 RELIABLE(전송 보장, 더 많은 리소스 필요) 중 선택한다. RELIABLE 구독자는 BEST_EFFORT 발행자와 연결될 수 없다.20DURABILITY: 늦게 참여하는 구독자를 위해 데이터 지속성을 제어한다. VOLATILE(지속성 없음), TRANSIENT_LOCAL(발행자가 데이터 캐시), TRANSIENT/PERSISTENT(서비스가 데이터 캐시) 등의 수준이 있다.20HISTORY: 각 인스턴스에 대해 얼마나 많은 데이터 샘플을 저장할지 결정한다. KEEP_LAST(depth) 또는 KEEP_ALL로 설정할 수 있다.20LIVELINESS: 참여자가 여전히 활성 상태인지 감지하는 메커니즘으로, 임대 기간(lease duration)을 설정할 수 있다.20DEADLINE: 샘플 간 최대 도착 시간을 명시하는 계약으로, 마감 시간 초과 시 알림을 받을 수 있다.20OWNERSHIP: 동일한 토픽 인스턴스에 여러 발행자가 있을 경우를 관리하며, 장애 복구(failover) 구성을 가능하게 한다.16DDSI-RTPS(Real-Time Publish-Subscribe Protocol) 와이어 프로토콜은 RTI, eProsima, OpenDDS 등 서로 다른 벤더의 DDS 구현체들이 원활하게 통신할 수 있도록 보장하는 핵심 요소다.6 “Shapes” 데모는 이러한 상호운용성을 시연하고 테스트하기 위한 사실상의 표준으로 사용된다.1
이러한 특성들을 종합해 볼 때, DDS는 단순한 메시지 전달 시스템을 넘어선다. ‘글로벌 데이터 공간’, 키를 가진 토픽, 인스턴스 개념, 그리고 DURABILITY와 HISTORY 같은 풍부한 QoS 정책의 조합은 DDS를 ‘움직이는 데이터베이스(database in motion)’로 이해하게 만든다. read, take와 같은 API는 전통적인 메시지 큐의 send/receive보다 데이터베이스의 CRUD 작업에 더 가깝다. 이는 DDS가 단순 통신 프로토콜이 아니라 실시간 시스템의 상태를 관리하고 동기화하는 프레임워크임을 시사하며, MQTT나 ZeroMQ와 같은 다른 미들웨어와의 근본적인 차이점을 형성한다.11
러스트는 성능, 안정성, 생산성이라는 세 가지 핵심 가치를 제공하는 현대적인 시스템 프로그래밍 언어다.26 C/C++의 성능 수준을 유지하면서, 이들 언어에서 흔히 발생하는 특정 유형의 버그들을 원천적으로 제거하는 것을 목표로 설계되었다.27
러스트가 C/C++와 동등한 수준의 성능을 낼 수 있는 이유는 다음과 같다.
러스트 혁신의 핵심은 메모리 안전성을 보장하는 독특한 모델에 있다.
& 및 &mut)를 통해 데이터를 ‘빌리는’ 개념이다. 컴파일러는 ‘하나의 가변 참조’ 또는 ‘여러 개의 불변 참조’ 중 하나만 허용한다는 핵심 규칙을 강제한다. 이 규칙이 러스트 안전 보장의 근간을 이룬다.32소유권과 빌림 규칙은 자연스럽게 멀티스레드 프로그래밍으로 확장된다. 공유된 가변 상태를 원천적으로 방지함으로써, 컴파일러는 동시성 시스템에서 가장 다루기 어려운 버그 중 하나인 데이터 경쟁(data race)을 제거한다. 이를 통해 개발자들은 훨씬 더 큰 확신을 가지고 병렬 코드를 작성할 수 있다.28
러스트의 현대적인 툴체인은 생산성을 높이는 핵심 요소다.
cargo: 통합 패키지 관리자이자 빌드 도구로, 의존성 관리와 프로젝트 빌드를 단순화하여 분편화된 C++ 생태계에 비해 큰 이점을 제공한다.27crates.io: 러스트 커뮤니티의 중앙 패키지 저장소 역할을 한다.27러스트의 엄격한 컴파일러, 특히 빌림 검사기는 단순한 안전 기능을 넘어선다. 이는 개발자가 데이터 흐름, 소유권, 상태 관리에 대해 더 엄격하게 생각하도록 강제하는 설계 도구 역할을 한다. C++와 같은 언어에서는 포인터와 참조를 자유롭게 전달할 수 있지만, 바로 그 자유가 댕글링 포인터나 반복자 무효화와 같은 수많은 런타임 오류의 근원이 된다.37 러스트는 이러한 개발자의 규율을 컴파일러에 내재화했다.26 소유권이 모호하거나 별칭 규칙(aliasing rules)이 위반된 코드는 컴파일을 거부한다. 따라서 DDS와 같이 복잡한 프로토콜을 러스트로 구현하는 것은 단순히 API를 번역하는 행위가 아니다. 언어 자체가 제공하는 규율은 견고하고 동시성 높은 실시간 시스템을 구축하는 데 매우 유익하며, 그 결과물은 메모리 안전성을 넘어 아키텍처적으로도 더 견고해지는 경향이 있다.
이 파트에서는 일반적인 기술 논의에서 벗어나 RustDDS 구현체 자체를 심층적으로 분석한다. 프로젝트의 핵심 설계 철학, API 구조, 그리고 DDS 표준을 러스트다운 방식으로 어떻게 변환했는지에 초점을 맞춘다.
RustDDS는 핀란드의 로보틱스 및 ROS2 전문 기업인 Atostek Oy가 개발한 순수 러스트 기반의 DDS 구현체다.1 이 프로젝트는 Apache 2.0 라이선스로 공개되어 있다.38
RustDDS 설계의 가장 중요한 특징은 API 철학에 있다.
snake_case와 같은 명명 규칙을 따른다.40create_/delete_ 메서드 대신 러스트의 소유권 및 RAII 모델을 활용한다.40Result/Option을 통한 오류 처리: DDS의 정수 반환 코드 대신 표준 러스트 오류 처리 방식인 Result<T, E>와 Option<T>를 사용한다.1코드 생성 대신 제네릭: RustDDS는 러스트의 제네릭 프로그래밍을 활용하여 DataReader<D, SA>와 DataWriter<D, SA>를 구현했다. 여기서 D는 데이터 타입, SA는 직렬화 어댑터 타입을 나타낸다. 이는 C++ DDS 구현체에서 흔히 사용되는 코드 생성 단계를 피하게 해준다.40
mio를 이용한 비동기 I/O: 표준 DDS의 Listeners와 WaitSets를 구현하는 대신, 비동기 이벤트 기반 I/O를 위해 mio(Metal I/O) 라이브러리를 기반으로 구축되었다. DataReader는 mio의 Evented(v0.6) 또는 Source(v0.8) 트레이트를 구현하여 폴링 루프에 등록될 수 있다.13
Serde를 이용한 직렬화: 데이터 직렬화 및 역직렬화는 러스트 생태계에서 널리 사용되는 Serde 프레임워크와의 통합을 통해 처리된다. 이는 serde::Serialize와 serde::Deserialize를 구현하는 모든 데이터 타입을 RustDDS를 통해 전송할 수 있음을 의미한다.13 DDS 표준에 명시된 기본 와이어 포맷인 CDR은
CDRSerializerAdapter와 CDRDeserializerAdapter를 통해 구현된다.13
프로젝트 문서에 따르면, 동적 발견, 신뢰성 QoS, 이력 QoS, UDP 기반 RTPS, 그리고 with_key 및 no_key 토픽과 같은 핵심 기능은 안정적으로 구현되어 있다. 더 진보된 QoS 정책이나 공유 메모리 전송과 같은 기능의 구현 상태도 확인된다.1
RustDDS의 설계 결정들, 즉 mio, Serde, 제네릭, Result/Option의 사용은 DDS 전용 메커니즘을 독립적으로 재창조하기보다 기존의 러스트 생태계와 깊이 통합하려는 전략적 선택을 보여준다. 이는 러스트 프로그래머에게 익숙한 개발 경험과 생태계 호환성이 주는 이점이 DDS 표준 API와의 불일치로 인한 비용보다 크다는 판단에 기반한다. 러스트 개발자는 Serde를 통해 데이터 타입 호환성을 쉽게 확보하고 13,
mio를 통해 tokio와 같은 비동기 런타임의 이벤트 루프 모델을 자연스럽게 이해할 수 있다.13 이는 러스트에 이미 투자한 팀에게 RustDDS를 매력적인 선택지로 만들지만, 다른 언어로 DDS를 경험한 개발자에게는 기존 지식을 1:1로 적용할 수 없어 새로운 학습 곡선을 요구하는 계산된 트레이드오프다.
간단한 발행자와 구독자를 설정하는 과정은 다음과 같다.
DomainParticipant를 생성한다.13Topic을 생성한다.13Publisher 및/또는 Subscriber를 생성한다.13Publisher와 Topic으로부터 DataWriter를 생성한다.13Subscriber와 Topic으로부터 DataReader를 생성한다.13다음은 이 흐름을 보여주는 간단한 코드 예시다.13
Rust
use rustdds::*;
use rustdds::no_key::{DataReader, DataWriter};
use serde::{Serialize, Deserialize};
#
struct SomeType { a: i32 }
let domain_participant = DomainParticipant::new(0).unwrap();
let qos = QosPolicyBuilder::new()
.reliability(policy::Reliability::Reliable { max_blocking_time: Duration::from_millis(100) })
.build();
let publisher = domain_participant.create_publisher(&qos).unwrap();
let subscriber = domain_participant.create_subscriber(&qos).unwrap();
let some_topic = domain_participant.create_topic(
"SomeTopic".to_string(),
"SomeType".to_string(),
&qos,
TopicKind::NoKey,
).unwrap();
let writer = publisher.create_datawriter_no_key::<SomeType, CDRSerializerAdapter<SomeType>>(
&some_topic,
None,
).unwrap();
let mut reader = subscriber.create_datareader_no_key::<SomeType, CDRDeserializerAdapter<SomeType>>(
&some_topic,
None,
).unwrap();
No_Key 토픽: 단순한 단일 인스턴스 데이터 스트림으로, no_key 모듈의 타입을 사용한다.13
With_Key 토픽: 여러 인스턴스를 다루는 데이터 스트림으로, 맵(map)과 유사하다. 이 경우 데이터 타입은 키를 추출하기 위한 Keyed 트레이트를 반드시 구현해야 한다. 이는 단일 토픽 내에서 여러 객체의 상태를 관리하는 데 필수적인 개념이다.13
with_key와 no_key 버전의 리더/라이터가 타입 시그니처에서 차이를 보이는 것은 바로 이 키 접근의 필요성 때문이다.13
러스트 구조체를 RustDDS에서 사용 가능하게 만드는 과정은 다음과 같다.
serde::Serialize와 serde::Deserialize를 파생(derive)시킨다.WithKey 토픽을 사용할 경우, 해당 구조체에 rustdds::Keyed 트레이트를 구현한다.13DataWriter/DataReader 생성 시, 제네릭 타입 파라미터로 CDRSerializerAdapter<MyType> 또는 CDRDeserializerAdapter<MyType>를 지정한다.13I/O 이벤트를 처리하는 방법은 다음과 같이 나뉜다.
mio를 이용한 폴링: 저수준의 기본 방식이다. DataReader를 mio::Poll 인스턴스에 등록하고 준비 상태 이벤트를 기다리는 방식으로 동작한다.13 최대의 제어권을 제공하지만 수동으로 이벤트 루프를 관리해야 한다.
async/await 스트림: 고수준의 인체공학적 방식이다. .async_sample_stream()과 같은 메서드를 사용하여 DataReader를 futures::stream::Stream으로 변환할 수 있다. 이를 통해 tokio나 smol과 같은 비동기 런타임 내에서 표준 async/await 문법을 사용할 수 있다.13 전체
DataSample을 반환하는 스트림과 순수 데이터만 반환하는 스트림이 별도로 제공된다.1
read()(데이터를 빌려오며 리더 캐시에 남겨둠)와 take()(데이터를 이동시키며 캐시에서 제거함)의 의미적 차이는 DDS의 핵심 개념이다.13 또한 ReadCondition::not_read()와 같은 다양한 읽기/가져오기 조건을 사용할 수 있다.42
RustDDS의 API는 강력하지만, DDS 개념과 저수준 비동기 러스트(mio)에 익숙하지 않은 사용자에게는 학습 곡선이 가파를 수 있다. 실제로 한 사용자는 간단한 단일 프로세스 예제를 두 개의 프로세스로 분리하는 데 어려움을 겪었고, mio 기반의 복잡한 예제에 혼란을 느꼈다고 보고했다.41 개발자의 답변에 따르면, 고수준 비동기 프레임워크를 사용하지 않는 한 프로세스 간 통신에는 mio 기반의 폴링 루프가 필수적이다.41 이는 ‘Hello, World’ 수준의 예제에서 실제 분산 애플리케이션으로 넘어가는 데 상당한 개념적 도약이 필요함을 시사한다. 따라서 신규 사용자는 가능하면 mio의 복잡성을 추상화하는 async/await 스트림 기반 API로 시작하는 것이 권장된다.
이 파트에서는 RustDDS를 더 넓은 기술적, 경쟁적 환경에 위치시킨다. 주요 경쟁자와 비교하고, 핵심적인 ROS2 생태계에서의 역할을 평가하며, 성능 프로파일을 분석한다.
순수 러스트 DDS 구현체 시장에는 RustDDS와 Dust-DDS라는 두 주요 경쟁자가 존재한다. 두 프로젝트는 동일한 목표를 추구하지만, 근본적인 설계 철학과 기술적 선택에서 뚜렷한 차이를 보인다. 이는 잠재적 사용자가 기술을 선택할 때 신중하게 고려해야 할 중요한 트레이드오프를 제시한다.
| 기능 | RustDDS (Atostek 개발) | Dust-DDS (S2E Software Systems 개발) |
|---|---|---|
| 개발 철학 | 러스트다운(Rust-Idiomatic): “러스트 개념과 관례를 사용한 기능적 동등성”을 추구.1 러스트 개발자 경험을 우선시한다. | 표준 준수(Standard-Conforming): OMG DDS 표준 API를 최대한 가깝게 따르는 것을 목표로 한다.43 |
| 핵심 비동기 모델 | mio 기반 폴링: mio 라이브러리 기반의 비동기 I/O. 고수준 async 스트림 래퍼를 제공한다.13 |
액터 모델과 tokio: tokio 런타임 기반의 내부 액터 모델을 사용한다.14 |
unsafe 코드 정책 |
성능이나 FFI를 위해 필요한 경우 unsafe 코드를 사용한다 (명시적인 no_unsafe 선언 없음). |
#![forbid(unsafe_code)]: 순수하고 안전한 러스트 구현을 명시적으로 보장한다.45 |
| 이벤트 처리 API | DDS의 Listener/WaitSet을 mio 폴링 또는 async 스트림으로 대체한다.40 |
표준 DDS Listener/WaitSet API(트레이트)와 완전한 async API를 모두 제공한다.14 |
| 데이터 타입 정의 | DataReader/DataWriter에 제네릭을 사용하고, 키가 있는 타입에는 Keyed 트레이트를 요구한다.13 |
데이터 타입 자체에 추가 트레이트를 사용해 키와 표현을 정의하며, DdsType 파생 매크로를 제공한다.43 |
‘러스트다운’ 접근 방식과 ‘표준 준수’ 접근 방식은 서로 다른 개발팀에 각기 다른 장단점을 제공한다. RustDDS의 접근 방식은 기존 러스트 개발자들이 Serde, mio, Result 등 익숙한 도구와 패턴을 그대로 활용할 수 있게 하여 학습 곡선을 낮추고 생태계와의 통합을 용이하게 한다. 반면, Dust-DDS의 접근 방식은 C++나 Java 등 다른 언어로 DDS를 사용해 본 개발자들이 기존의 지식과 개념(Listener, WaitSet 등)을 더 직접적으로 적용할 수 있게 해준다.
RustDDS의 mio 기반 구조는 특정 비동기 런타임에 종속되지 않는 유연성을 제공하지만, 개발자가 직접 이벤트 루프를 관리해야 하는 부담이 있다. Dust-DDS의 tokio 기반 액터 모델은 tokio 생태계와 긴밀하게 통합되어 강력한 동시성 처리를 제공하지만, tokio 런타임 사용이 전제된다. 액터 모델은 잠금(locking)과 관련된 교착 상태(deadlock) 위험을 줄이는 데 도움이 될 수 있다.14
Dust-DDS의 no_unsafe 보증은 매우 중요한 차별점이다.45 이는 코드베이스 전체에서 unsafe 블록의 사용을 금지함으로써 컴파일러가 보장하는 메모리 안전성을 100% 신뢰할 수 있음을 의미한다. 이는 감사나 공식적인 검증이 요구되는 고도의 안전 필수(safety-critical) 또는 보안 시스템에서 결정적인 이점이 될 수 있다.
데이터 타입을 정의하고 이벤트를 처리하는 개발자 경험은 두 라이브러리 간에 차이가 있다. RustDDS는 제네릭과 트레이트를 조합하는 방식을, Dust-DDS는 파생 매크로와 타입 자체에 부가된 트레이트를 사용하는 방식을 채택하여 43, 각기 다른 수준의 추상화와 유연성을 제공한다.
RustDDS는 DDSI-RTPS 와이어 프로토콜을 준수함으로써 주요 C/C++ DDS 벤더인 RTI Connext, eProsima FastRTPS, OpenDDS 등과 성공적으로 상호 운용됨이 입증되었다.1 이는 RustDDS가 기존의 이기종 DDS 시스템에 통합될 수 있음을 의미한다.
RustDDS의 전략적 위치는 네이티브 러스트 ROS2 생태계에서 두드러진다.
ros2-client: Atostek이 개발한 ros2-client 라이브러리는 rclcpp(C++)나 rclpy(Python)와 유사한 네이티브 러스트 API를 제공한다.38ros2-client는 내부 통신 엔진으로 RustDDS를 사용한다.39 이는 ROS2 위에서 순수 러스트로 완전한 로보틱스 애플리케이션을 구축하고자 하는 모든 이들에게 RustDDS가 필수적인 기반 구성 요소임을 의미한다.ros2_rust나 rclrust와 같은 대안적인 러스트 클라이언트 라이브러리도 존재하지만, 이들은 일반적으로 C/C++ 라이브러리(rcl, rmw)를 래핑(wrapping)하는 방식이므로 ros2-client와 같은 ‘순수 러스트’ 솔루션은 아니다.39
RustDDS의 가장 중요한 전략적 가치는 범용 DDS 구현체로서가 아니라, 네이티브 러스트-온-ROS2 생태계를 가능하게 하는 특정 기술이라는 점에서 찾을 수 있다. 로보틱스 커뮤니티는 ROS2를 통해 DDS를 표준으로 채택했고 5, 러스트의 안전성과 성능에 대한 관심이 이 분야에서 증가하고 있다.38 C/C++ 스택에 의존하지 않는 진정한 네이티브 러스트 애플리케이션을 구축하려면 순수 러스트 클라이언트 라이브러리가 필요하며, ros2-client가 그 역할을 한다.39 그리고 ros2-client는 RustDDS를 기반으로 한다.39 따라서 RustDDS는 이 틈새 시장이지만 성장하는 분야에서 핵심적인 역할을 하며, 그 발전은 로보틱스에서 러스트의 성공과 궤를 같이할 것이다.
연구 자료에 RustDDS에 대한 직접적인 벤치마크는 없지만, 그 성능 프로파일은 여러 근거를 통해 긍정적으로 예측할 수 있다.
사용자가 직접 RustDDS의 성능을 측정하고자 할 때 고려해야 할 모범 사례는 다음과 같다.
워크로드 정의: 마이크로벤치마크뿐만 아니라 실제 사용 사례를 대표하는 워크로드를 사용하는 것이 중요하다.50 DDS의 경우, 이는 대표적인 데이터 크기, 발행 주기, 발행자/구독자 수를 의미한다.
핵심 메트릭: DDS 시스템의 핵심 성능 지표는 다음과 같다.
write() 호출부터 DataReader에서 데이터를 사용할 수 있을 때까지의 종단 간 시간.도구: hyperfine과 같은 범용 러스트 벤치마킹 도구나 bencher를 이용한 지속적인 벤치마킹이 유용할 수 있다.50
rustls-bench의 사례는 프로토콜을 위한 맞춤형 테스트 하네스를 구축하는 좋은 본보기를 보여준다.51
DDS, Zenoh, Kafka, MQTT 간의 성능 비교 벤치마크에 따르면 12, 일부 시나리오에서는 Zenoh가 더 빠를 수 있지만, DDS는 Kafka나 MQTT와 같은 브로커 기반 시스템보다 P2P, 저지연 통신에서 월등히 높은 성능을 보인다. 이는 잘 구현된 러스트 버전의 DDS가 매우 높은 성능을 제공할 것이라는 주장을 뒷받침한다.
보고서의 마지막 파트에서는 분석 내용을 종합하여 RustDDS 프로젝트에 대한 전체적인 평가를 제공하고, 잠재적 도입자를 위한 실행 가능한 조언을 제시한다.
RustDDS 프로젝트의 건전성은 여러 지표를 통해 긍정적으로 평가된다.
dependabot을 사용하여 const-oid와 같은 의존성을 최신 상태로 유지하는 것은 좋은 프로젝트 위생 상태를 보여준다.53crates.io에는 명확한 버전 이력이 있으며, 정기적인 릴리스는 지속적인 개발과 버그 수정을 시사한다.20공개된 이슈와 토론을 통해 현재 커뮤니티가 다루고 있는 도전 과제나 한계를 파악할 수 있다.41 앞서 언급된 학습 곡선과 문서화의 간극이 대표적인 예다.
RustDDS에 대한 공식적인 ROADMAP.md는 없지만, 미래 방향은 여러 단서를 통해 추론할 수 있다.
iceoryx2 로드맵은 DDS 게이트웨이의 잠재적 백엔드로 rustdds 또는 dustdds를 언급하고 있어, 다른 고성능 통신 프레임워크와의 통합 가능성을 시사한다.56ros2-client와의 긴밀한 결합은 39 RustDDS의 로드맵이 ROS2의 릴리스 주기와 기능 세트(예: “Iron”과 같은 새로운 ROS 배포판 지원 39)에 큰 영향을 받을 것임을 암시한다.RustDDS는 실용적이고 러스트다운 API를 갖춘, 성숙하고 활발하게 개발되는 순수 러스트 DDS 구현체다. 그 핵심 전략적 가치는 네이티브 러스트-온-ROS2 생태계를 가능하게 하는 기술이라는 데 있다. 경쟁 구도에는 표준 준수와 절대적인 메모리 안전성을 우선시하는 Dust-DDS가 있으며, 이는 다른 유효한 설계적 트레이드오프를 보여준다.
기술 리더를 위한 실행 가능한 지침은 다음과 같다.
mio나 tokio/futures를 포함한 관용적인 러스트 프로그래밍에 이미 능숙할 때.#![forbid(unsafe_code)] 정책이 필수 요구사항일 때.tokio 액터 모델에 크게 의존할 때.cargo)의 이점을 누리고자 할 때 러스트 기반 솔루션(RustDDS 또는 Dust-DDS)을 선택하는 것이 이상적이다. 이는 신규 프로젝트나 기존 시스템에 더 안전한 구성 요소를 도입할 때 특히 유용하다.| DDS Middleware. What is DDS middleware: | by Huseyin Kutluca | Software Architecture Foundations | Medium, accessed July 8, 2025, https://medium.com/software-architecture-foundations/dds-middleware-1af525f69753 |
| QoS | Data Distribution Service (DDS) Community RTI Connext Users, accessed July 8, 2025, https://community.rti.com/glossary/qos |
| Interoperability RustDDS x OpenDDS | by Alghani - Medium, accessed July 8, 2025, https://medium.com/@alghani63/interoperability-rustdds-x-opendds-7cf77fef7164 |
| ZeroMQ vs. DDS Software: What’s the Difference? | RTI, accessed July 8, 2025, https://www.rti.com/blog/2017/04/20/why-would-anyone-use-dds-over-zeromq |
| Rust: The Future of Memory-Safe Software Development | Bitrock, accessed July 8, 2025, https://bitrock.it/blog/rust-the-future-of-memory-safe-software-development.html |
| Memory-Safe Programming Languages and National Cybersecurity: - A Technical Review of Rust | by Adnan Masood, PhD. | Medium, accessed July 8, 2025, https://medium.com/@adnanmasood/memory-safe-programming-languages-and-national-cybersecurity-a-technical-review-of-rust-fbf7836e44b8 |
| dds and rust | Data Distribution Service (DDS) Community RTI Connext Users, accessed July 8, 2025, https://community.rti.com/forum-topic/dds-and-rust |