피드로 돌아가기
qdf: a Go serializer that decodes less, packs harder, and lets you query the bytes
Dev.toDev.to
Backend

Protobuf급 크기와 JSON의 유연성을 갖춘 Queryable Go 시리얼라이저

qdf: a Go serializer that decodes less, packs harder, and lets you query the bytes

Aleksandr Yershov2026년 6월 3일22advanced

Context

기존 binary serializer는 Schemaless, Small Wire, Fast Decode 중 두 가지만 선택 가능한 트레이드오프 존재. JSON은 유연하나 CPU/GC 부하가 크고, Protobuf는 효율적이나 .proto 파일 관리와 Codegen 단계의 오버헤드가 발생하는 한계 직면.

Technical Solution

  • Struct Tag 기반의 Schemaless 설계로 .proto 파일 및 Codegen 단계 제거
  • Type Descriptor 캐싱을 통해 Reflection 비용을 최소화하고 Unsafe field offset 기반의 고속 접근 구조 설계
  • Dense mode 도입을 통한 반복 키 및 값의 1-byte back-reference 압축으로 데이터 크기 최적화
  • Columnar Transpose 및 Per-column Codec Picker 적용으로 데이터 특성에 맞는 최적의 인코딩 방식(FOR, RLE, Dictionary 등) 자동 선택
  • ColumnIndex 기반의 O(1) Skip 메커니즘을 통해 전체 디코딩 없이 특정 컬럼/로우만 읽어내는 Queryable-bytes 기능 구현
  • AVX2/NEON 비트 패킹 및 rANS 압축 옵션을 통한 전송 효율 극대화

Impact

  • Protobuf 대비 최대 68% 작은 데이터 크기 달성
  • encoding/json 대비 4~9배 빠른 디코딩 속도 구현
  • Hand-written AVX2/NEON 비트 패킹을 통해 약 50 GB/s 처리 성능 확보

Key Takeaway

데이터 집합의 반복 패턴을 활용한 Interning 기법과 컬럼 지향 저장 구조를 결합하면 Schemaless 환경에서도 고밀도 압축과 부분 디코딩 성능을 동시에 확보 가능함.


- 대량의 로그, 메트릭, 이벤트 데이터 처리 시 Full-decode 대신 Selective decode 적용 검토 - 데이터 타입별 최적 압축 알고리즘(Delta, RLE 등)을 자동 선택하는 Codec Picker 도입 고려 - Codegen 오버헤드가 병목인 파이프라인에서 Struct Tag 기반의 유연한 직렬화 도구로 교체 검토

원문 읽기