본문 바로가기

Studying/Data System Design

부호화와 발전 [데이터 중심 애플리케이션 설계 4장]

  1. 데이터 부호화 형식
    1. 부호화(직렬화, 마샬링): 인메모리 표현을 바이트열로 변환하는 작업
    2. 복호화(역직렬화, 파싱, 언마샬링): 바이트열을 표현으로 변환하는 작업
    3. 언어별 형식: 언어에서 제공하는 만큼 편리하지만, 특정 언어에 적합한 형식으로 다른 언어나 상위/하위 호환 등에 문제가 발생한다.
    4. JSON, XML: 수를 표현할 때 애매한 문제가 있다, 유니코드는 잘 지원하나 바이너리는 잘 지원하지 않아서 base64를 사용하게 된다.
      1. 이진부호화: json의 경우 여러가지 이진 부호화가 있었지만 널리 채택되진 못 했고, 대부분 성능상의 큰 이점은 없음
    5. 스리프트(Thrift)와 프로토콜 버퍼(Protocol Buffers)
      1. 같은 원리를 기반으로 함. 이름 대신 필드 태그를 사용함
      2. required의 경우 이진 데이터에선 확인하지 않고 읽기 시점에서 확인 함
      3. 태그 번호를 사용하므로 optional로 추가하거나 optional만 삭제한다면 상위호환성과 하위호환성을 유지함
    6. 상위호환성: 예전 코드에서 새로운 코드로 기록된 데이터를 읽는 것
    7. 하위호환성: 새로운 코드에서 예전 데이터를 읽는 것
    8. avro
      1. 태그번호나 타입 등이 없고 단순히 문자열을 연결하는 방식
      2. 따라서 스키마가 같아야만 이진 데이터를 복호화할 수 있다.
      3. 스키마 에볼루션에서는 호환만 가능하면 되도록 한다.
        1. 읽기 스키마에 없는 스키마를 만나면 무시하고 새로운 스키마는 기본값으로 채운다.
      4. 상위호환성과 하위호환성은 기본값이 있는 경우에만 추가, 삭제가 가능하다.
    9. 쓰기 스키마를 저장하는 법
      1. 모든 레코드가 동일한 스키마라고 가정하여 처음에만 저장하는 방식(하둡 등)
      2. 각 레코드 별로 버전을 포함하여 같은 버전끼리는 같은 스키마를 사용하는 방식
      3. 네트워크 통신을 할 떄 스키마 버전을 합의하는 방식
  2. 데이터플로
    1. REST
      1. 네트워크 상에서 API 요청을 하기 위한 가장 최신 형상이다.
      2. 네트워크 요청을 로컬 함수 처럼 취급하여 제어가 어려워진다.
        1. 네트워크로 인한 예외 처리, 유실, 지연, 제한 등이 있다.
      3. 테스트와 디버깅에 효율적이여서 오픈 API에서 주요한 방식
    2. 차세대 RPC
      1. 원격 요청이 로컬 함수와는 다르다는 걸 분명히 한다.
        1. future(promise) 등 사용
        2. gRPC에서는 스트림 처리 지원
      2. 클라이언트를 강제로 업그레이드 할 수 없기 때문에 조직 내에서만 사용할 때 좋다.
    3. 메시지 전달
      1. 생산자 → 브로커 → 소비자 의 구조
      2. 비동기
      3. 유실 가능성 적음
      4. 분산 엑터 프레임워크: 단일 프로세스에서도 분산으로 처리한다고 가정하기 때문에 위치 투명성이 높고, 로컬과의 차이를 발생시키지 않는다.