12P by xguru 14일전 | ★ favorite | 댓글 4개
  • 효율적인 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로 직렬화 할거면.. 그냥 바이너리 직렬화 쓰던 때랑 뭐가 ...다른거죠?

그냥 바이너리로 뽑으면 그걸 뽑은 언어와 런타임에서만 유효하지만 저런 포맷은 대체로 다른 언어 다른 환경과 주고받는걸 가정하고 만들어집니다

아하. 그렇군요. 답변 감사합니다.