피드로 돌아가기
Zero-copy protobuf and ConnectRPC for Rust
Dev.toDev.to
Backend

Zero-copy protobuf and ConnectRPC for Rust

Anthropic이 순수 Rust 기반 Protocol Buffers 구현(buffa)과 ConnectRPC 구현(connect-rust)을 개발해 decode-heavy 워크로드에서 tonic+prost 대비 33% 성능 향상 달성

Iain McGinniss2026년 3월 25일12advanced

Context

Rust 생태계의 기존 protobuf 구현들(Prost, Google's protobuf v4)이 Proto2/Proto3 에디션 지원 부재, 제한된 RPC 레이어, 성능 최적화 기회 부족이라는 한계를 가지고 있었다. 프로덕션 환경에서 per-field String allocation과 map field HashMap 구성으로 인한 할당자 압력이 병목이 되었다.

Technical Solution

  • Protocol Buffers 에디션 우선 지원: 기존 Proto2/Proto3 분화를 feature-flag 기반 접근으로 통합하는 buffa 구현으로 레거시 마이그레이션 용이성 확보
  • Zero-copy message views 패턴 도입: MyMessage(소유권 기반, heap 할당)와 MyMessageView<'a>(wire buffer 직접 참조) 이중 생성으로 String 복사 제거 및 map field를 flat Vec<(K, V)> 스캔으로 변환
  • OwnedView 추상화 추가: view와 backing Bytes buffer를 번들링해 async/await 경계를 넘을 수 있게 lifetime 문제 해결
  • Tower 기반 ConnectRPC 구현: Connect, gRPC, gRPC-Web 프로토콜을 동일 핸들러로 처리하는 connect-rust 제공으로 프로토콜 선택 자유도 확보
  • buf CLI 및 no_std 통합: 언어 무관 코드 생성과 crate feature 세분화로 다양한 빌드 환경 지원

Impact

  • Decode-heavy 워크로드(50개 구조화 로그 레코드, 약 22KB 배치)에서 tonic+prost 대비 33% 성능 향상
  • CPU 할당자 압력 9.6%에서 3.6%로 감소(62.5% 절감)
  • Connect 프로토콜이 gRPC 대비 unary RPC에서 저동시성 5%, 고동시성(c=256) 23% 처리량 향상
  • gRPC의 trailer HEADERS frame 제거로 200k+ req/s에서 200k 개의 h2 HEADERS 인코딩 제거
  • Google's protobuf binary conformance suite와 JSON conformance suite 통과
  • 약 12,800개의 ConnectRPC server, client, TLS 테스트 케이스 통과

Key Takeaway

Rust의 borrow checker와 lifetime 시스템을 활용하면 다른 언어에서 불가능한 zero-copy 추상화를 안전하게 구현할 수 있으며, 이를 통해 RPC 프레임워크의 할당자 압력을 근본적으로 감소시킬 수 있다. Specification-driven development와 AI 보조 개발이 결합되면 복잡한 기반 라이브러리를 6주 내에 프로덕션 수준으로 완성할 수 있다.


높은 메시지 처리량을 요구하는 Rust 기반 마이크로서비스에서 buffa의 MyMessageView<'a>를 도입하면 per-request 할당 횟수를 string/bytes field 개수만큼 감소시킬 수 있고, OwnedView 래퍼를 통해 async handler에서도 zero-copy 이점을 유지할 수 있다. 특히 Prost에서 마이그레이션 시 동일한 semantics 하에서 33% 처리량 향상을 기대할 수 있다.

원문 읽기