MessagePack - JSON과 비슷하지만 작고 빠른 이진 직렬화 포맷
(msgpack.org)- 효율적인 Binary Serialization 포맷
- JSON처럼 여러 언어 간 데이터 교환 가능
- 작은 정수는 단일 바이트로 인코딩, 짧은 문자열은 문자열 자체에 추가 바이트가 하나만 더 필요
- 50개 이상의 프로그래밍 언어 및 환경에서 지원
- 사용 사례:
- Redis: Lua용 MessagePack C 확장을 추가해 데이터 직렬화에 활용
- Fluentd: 내부 데이터 표현에 MessagePack 사용, 고속 처리 가능
- Treasure Data: 분석 쿼리에 최적화된 다중 테넌트 데이터베이스 구축
- Pinterest: MessagePack과 Memcache로 피드 캐시 압축 및 빠른 처리
두개의 컨셉 : "Type System" 과 "Format"
- 타입 시스템
- Integer: 정수
-
Nil:
null
값 -
Boolean:
true
또는false
- Float: IEEE 754 부동 소수점
- Raw: 문자열 또는 바이트 배열
- Array: 객체 배열
- Map: 키-값 쌍
-
Extension: 사용자 정의 타입
- Timestamp: 시간 정보
- 포맷
- positive fixint, negative fixint, fixmap, fixarray
- nil, false, true
- bin 8/16/32, ext 8/16/32, float 32/64
- uint 8/16/32/64, int 8/16/32/64, fixext 1/2/4/8/16, str 8/16/32
- array 16/32, map 16/32
- 포맷 예시
-
fixint
: 7비트 정수 (양수는 0x00–0x7F, 음수는 0xE0–0xFF) -
fixstr
: 최대 31바이트 문자열 -
array 16
: 최대 (2^16)-1 요소를 가진 배열 -
map 16
: 최대 (2^16)-1 키-값 쌍
-
MessagePack의 장점
- 데이터 크기 최소화 및 속도 최적화
- 기존 JSON 기반 애플리케이션의 대체 및 개선
- 간단한 구현으로 다양한 환경에서 유연하게 활용 가능
게임 서버랑 통신 할 때 MessagePack을 적용하려고 했는데.. 설명처럼 다양한 환경에서의 유연화가 잘 안되더라구요. 그래서 protobuf 썼습니다.
제가 잘 몰라서 그런지는 모르겠는데.. json 대신 크기랑 속도를 위해 hex로 직렬화 할거면.. 그냥 바이너리 직렬화 쓰던 때랑 뭐가 ...다른거죠?