Protobuf 왜 사용할까? (feat. Varint)

소일로·2025년 3월 13일
0
post-thumbnail

Protobuf 왜 사용할까? (feat. Varint)

1. Protobuf란?

protobuf(Protocol Buffers)는 Google에서 개발한 직렬화(serialization) 포맷으로, 데이터를 더욱 가볍고 빠르게 저장하고 전송할 수 있도록 만들어졌습니다. 기존 JSON이나 XML보다 공간을 덜 차지하면서도 속도가 빠르다는 점이 큰 장점입니다.

  • Protobuf의 장점

    • 바이너리 포맷을 사용하여 데이터 크기를 대폭 줄일 수 있음
    • 스키마 기반이라 데이터 구조가 엄격하게 유지됨
    • 다양한 프로그래밍 언어에서 쉽게 사용할 수 있음
  • Protobuf의 단점

    • 사람이 직접 읽기 어렵다
    • JSON처럼 동적으로 필드를 추가하는 것이 쉽지 않음

2. Varint란? (숫자를 더 작게 저장하는 방법)

varint(Variable-length integer)는 protobuf에서 숫자를 더욱 효율적으로 저장하는 방법입니다. 일반적인 정수 타입(int32, int64)은 고정된 크기를 사용하지만, varint는 숫자가 작을수록 적은 바이트를 사용하여 공간을 절약할 수 있습니다.

  • Varint의 핵심 원리

    • 정수 값을 7비트 단위로 나누어 저장
    • 각 바이트의 최상위 비트(MSB, Most Significant Bit)를 활용하여 연속된 바이트 여부 표시
    • 작은 숫자는 1~2바이트만 사용, 큰 숫자는 5~10바이트까지 증가
  • 예제

    • 150varint로 표현하면:
      • 150 (10진수) → 10010110 00000001 (이진수, 2바이트)
    • protobuf에서는 이를 자동으로 처리하여 최적화함

3. 내부 통신 최적화: 어떻게 적용했을까?

이번 아키텍처 변경에서 protobufvarint를 활용하여 내부 패킷 구조를 최적화한 방법을 소개합니다.

3.1 패킷 구조 설계

내부 통신에서 사용될 패킷을 buffer로 감싸고, 내부 데이터는 protobuf를 사용하여 직렬화했습니다.

message InternalMessage {
  uint32 id = 1; // varint 적용
  string type = 2;
  bytes data = 3;
}

3.2 Varint 최적화 적용

  • uint32, uint64 타입을 활용하여 공간 절약
  • 필드 순서를 데이터 크기 기반으로 배치하여 전송 효율 극대화
  • fixed32, fixed64와 비교하여 최적의 타입 선택

3.3 성능 테스트 결과

기존 JSON 기반의 통신과 비교하여 패킷 크기와 처리 속도를 측정한 결과:

  • 패킷 크기: 평균 30~50% 감소
  • 처리 속도: 평균 40% 향상

4. gRPC와 함께 사용하면 더 강력해진다!

protobuf는 gRPC와 함께 사용할 때 더욱 강력한 성능을 발휘합니다. gRPC는 HTTP/2 기반의 원격 프로시저 호출(Remote Procedure Call) 프레임워크로, 높은 성능과 효율성을 제공합니다.

  • gRPC 활용 방법

    • protobuf를 gRPC 서비스의 메시지 포맷으로 사용하여 최적화된 통신 구현
    • HTTP/2 기반의 스트리밍 기능을 활용하여 실시간 데이터 전송 가능
    • varint를 통한 가벼운 직렬화 덕분에 요청과 응답 속도 개선
  • 예제 (gRPC 프로토콜 정의)

service InternalService {
  rpc GetInternalData (InternalRequest) returns (InternalResponse);
}

message InternalRequest {
  uint32 request_id = 1;
}

message InternalResponse {
  uint32 response_id = 1;
  string message = 2;
}
  • gRPC 사용의 장점
    • 기존 RESTful API보다 빠른 응답 속도
    • 다양한 프로그래밍 언어에서 gRPC 클라이언트 지원
    • 서비스 간 통신을 최적화할 수 있는 강력한 솔루션

5. 결론

JSON은 여전히 널리 사용되는 데이터 포맷이지만, 대용량 데이터를 빠르고 효율적으로 처리해야 하는 경우에는 protobufvarint를 활용하는 것이 훨씬 유리합니다. varint를 통해 작은 숫자는 적은 공간을 차지하게 하고, gRPC를 결합하면 높은 성능과 실시간 스트리밍 기능까지 활용할 수 있습니다.

📌 만약 여러분의 시스템에서 JSON 기반 통신이 성능의 병목이 되고 있다면, Protobuf와 gRPC를 도입하는 것을 고려해 보세요.

앞으로도 다양한 최적화 기법을 공부하며 더 효율적인 시스템을 구축해 나갈 계획입니다!

profile
백엔드 개발자

0개의 댓글