Rust 기반의 Protocol Buffers, 제로 카피 기술로 RPC 성능 UP!

by DD
2개월 전
조회수 20

Anthropic에서 Rust 기반의 Protocol Buffers 구현체 buffaConnectRPC 구현체 connect-rust를 오픈 소스화하여 RPC 생태계의 격차를 해소

buffa는 제로 카피(Zero-copy) 메시지 뷰를 지원하며, connect-rust는 Connect, gRPC, gRPC-Web을 단일 핸들러에서 지원하는 Tower 기반 구현체

제로 카피(Zero-copy) 기술을 통해 메모리 할당 비용(Allocation Cost) 감소 및 고성능을 달성했으며, 특히 로그 처리 시 33% 향상된 처리량(Throughput)을 보임

Conformance Suite 통과에도 불구하고, 보안 취약점(Security Vulnerability)이 발견되어, 테스트의 한계점을 보여줌

AI 기반 개발 방식을 통해 6주 만에 개발되었으며, 향후 Message extensions, Reflection, Textproto, protoyaml 등 기능 추가 예정

제로 카피(Zero-copy) 기술을 활용한 성능 개선

buffa는 Rust의 특징을 활용하여 제로 카피(Zero-copy) 메시지 뷰를 제공함으로써 메모리 할당 비용을 줄이고 성능을 향상시켰다. 기존 prost+tonic 방식에서 문자열(String) 및 바이트(Bytes) 필드 할당으로 인한 Allocator Pressure를 해결하기 위해, 입력 버퍼(Input Buffer)에서 직접 데이터를 참조하는 방식을 사용한다.

MyMessageView: 입력 버퍼를 직접 참조하여 할당 비용(Allocation Cost) 절감

OwnedView: 비동기 RPC 핸들러(Async RPC Handler)에서 안전하게 사용하기 위해 Bytes 버퍼와 뷰를 묶어 관리

벤치마크 결과: 로그 처리(Log Processing) 시 33% 향상된 처리량(Throughput), 3.6%의 CPU 사용률로 Allocator Pressure 감소

ConnectRPC, gRPC, gRPC-Web 지원 아키텍처

connect-rust는 Tower 기반으로 구축되어 ConnectRPC, gRPC, gRPC-Web을 동일한 핸들러에서 지원한다. 이는 다양한 RPC 프로토콜(RPC Protocol)을 통합 관리하고, 클라이언트(Client)와 서버(Server) 간의 호환성을 높이는 데 기여한다.

Monomorphic Dispatch: 컴파일 타임(Compile Time)에 메서드 이름을 매칭하여 동적 디스패치(Dynamic Dispatch) 오버헤드 제거

HTTP/1.1 및 HTTP/2 지원: TLS(Transport Layer Security)를 포함한 다양한 전송 계층(Transport Layer) 지원

Client/Server 구조: GreetService를 구현하고, Router를 통해 HTTP 프레임워크(HTTP Framework)와 통합

이러한 아키텍처는 확장성(Scalability)과 유연성(Flexibility)을 동시에 제공하며, 다양한 환경에서 RPC 서비스를 구축할 수 있도록 돕는다.

안전성(Safety) 및 편의성(Ergonomics) 개선

buffa는 protobuf의 안전성 문제를 해결하고, 개발 편의성을 높이기 위해 다양한 기능을 제공한다. 특히, Rust의 특징을 활용하여 안전한 코드를 작성할 수 있도록 지원한다.

DecodeOptions: 재귀 제한(Recursion Limit) 및 메시지 크기(Message Size) 제어를 통해 DoS 공격(Denial of Service Attack) 방지

UTF-8 검증(UTF-8 Validation): proto2 문자열(String)의 UTF-8 검증을 선택적으로 비활성화하여 호환성(Compatibility) 확보

MessageField, EnumValue: 필드 접근 및 enum 처리를 개선하여 개발 생산성(Developer Productivity) 향상

이러한 개선 사항들은 안정적인 RPC 서비스(RPC Service) 구축을 위한 핵심 요소이며, 개발자가 안전하고 효율적으로 코드를 작성할 수 있도록 돕는다.

AI 기반 개발 방식 도입

본문에서는 Claude Opus 4.6을 활용하여 6주 만에 buffa와 connect-rust를 개발한 과정을 설명한다. AI를 활용하여 개발 속도(Development Speed)를 향상시키고, 코드 품질을 유지하는 데 성공했다.

Specification-Driven Development: 명세 기반 개발 방식을 통해 정확성(Correctness)과 성능(Performance)을 동시에 확보

Conformance Suite 활용: Google의 protobuf binary 및 JSON conformance, ConnectRPC 테스트를 통과하여 프로토콜 준수(Protocol Compliance) 검증

AI의 한계: Conformance Suite 통과 이후에도 보안 취약점(Security Vulnerability) 발견

AI 기반 개발은 개발 효율성(Development Efficiency)을 높이는 데 기여하지만, 테스트 및 코드 검토(Code Review)를 통해 안전성을 확보하는 것이 중요하다.

향후 기능 추가 및 개선 계획

개발자는 Message extensions, Reflection, Textproto, protoyaml 등 다양한 기능 추가를 계획하고 있으며, 이는 라이브러리(Library)의 활용성을 더욱 높일 것으로 예상된다.

Message Extensions: 플러그인(Plugin) 및 미들웨어(Middleware) 구현을 위한 필수 기능

Reflection: 런타임(Runtime)에 제공되는 디스크립터(Descriptor)를 통해 알 수 없는 메시지 타입(Message Type) 처리

Textproto, protoyaml: proto2 시대의 C/C++ 서비스 마이그레이션(Migration) 지원 및 설정 파일(Configuration File) 지원

이러한 기능 추가는 개발자 경험(Developer Experience)을 개선하고, 다양한 환경에서 라이브러리를 사용할 수 있도록 지원할 것이다.

Zero-copy protobuf and ConnectRPC for Rust

댓글 0

첫 번째 댓글을 남겨보세요!