
protobuf(Protocol Buffers)는 Google에서 개발한 직렬화(serialization) 포맷으로, 데이터를 더욱 가볍고 빠르게 저장하고 전송할 수 있도록 만들어졌습니다. 기존 JSON이나 XML보다 공간을 덜 차지하면서도 속도가 빠르다는 점이 큰 장점입니다.
Protobuf의 장점
Protobuf의 단점
varint(Variable-length integer)는 protobuf에서 숫자를 더욱 효율적으로 저장하는 방법입니다. 일반적인 정수 타입(int32, int64)은 고정된 크기를 사용하지만, varint는 숫자가 작을수록 적은 바이트를 사용하여 공간을 절약할 수 있습니다.
Varint의 핵심 원리
예제
150을 varint로 표현하면:10010110 00000001 (이진수, 2바이트)protobuf에서는 이를 자동으로 처리하여 최적화함이번 아키텍처 변경에서 protobuf와 varint를 활용하여 내부 패킷 구조를 최적화한 방법을 소개합니다.
내부 통신에서 사용될 패킷을 buffer로 감싸고, 내부 데이터는 protobuf를 사용하여 직렬화했습니다.
message InternalMessage {
uint32 id = 1; // varint 적용
string type = 2;
bytes data = 3;
}
uint32, uint64 타입을 활용하여 공간 절약fixed32, fixed64와 비교하여 최적의 타입 선택기존 JSON 기반의 통신과 비교하여 패킷 크기와 처리 속도를 측정한 결과:
protobuf는 gRPC와 함께 사용할 때 더욱 강력한 성능을 발휘합니다. gRPC는 HTTP/2 기반의 원격 프로시저 호출(Remote Procedure Call) 프레임워크로, 높은 성능과 효율성을 제공합니다.
gRPC 활용 방법
protobuf를 gRPC 서비스의 메시지 포맷으로 사용하여 최적화된 통신 구현varint를 통한 가벼운 직렬화 덕분에 요청과 응답 속도 개선예제 (gRPC 프로토콜 정의)
service InternalService {
rpc GetInternalData (InternalRequest) returns (InternalResponse);
}
message InternalRequest {
uint32 request_id = 1;
}
message InternalResponse {
uint32 response_id = 1;
string message = 2;
}
JSON은 여전히 널리 사용되는 데이터 포맷이지만, 대용량 데이터를 빠르고 효율적으로 처리해야 하는 경우에는 protobuf와 varint를 활용하는 것이 훨씬 유리합니다. varint를 통해 작은 숫자는 적은 공간을 차지하게 하고, gRPC를 결합하면 높은 성능과 실시간 스트리밍 기능까지 활용할 수 있습니다.
📌 만약 여러분의 시스템에서 JSON 기반 통신이 성능의 병목이 되고 있다면, Protobuf와 gRPC를 도입하는 것을 고려해 보세요.
앞으로도 다양한 최적화 기법을 공부하며 더 효율적인 시스템을 구축해 나갈 계획입니다!