데이터 시스템의 기초
04장: 부호화와 발전
만물은 변한다 그대로 있는 것은 아무것도 없다 - 헤라클레이토스
시스템이 계속 원활하게 실행되게 하려면 양방향 호환성을 유지해야 된다
- 하위호환성 (backwards compatibility) 새로운 코드는 예전 코드가 기록한 데이터를 읽을수 있어야 된다
- 상위호환성 (forward compatibility) 예전 코드는 새로운 코드가 기록한 데이터를 읽을수 있어야 된다
데이터 부호화 형식
프로그램은 보통 두가지 형태로 표현된 데이터를 사용
- 메모리에 자료구조
- 파일에 쓰거나 바이트 형태
마샬링 언마샬링
언어별 형식
- 부호화는 보통 특정 프로그램밍 언어와 묶여 있어 다른 언어에서 데이터를 읽기는 매우 어렵다
- 동일한 객체 유형의 데이터를 복원하려면 복호화 과정이 임의의 클래스를 인스턴스화할 수 있어야 한다
- 테이터 버전 관리는 보통 부호화 라이브러리에서 나중에 생각하게 된다
- 효율성도 나중에 생각하게 된다
JSON과 XML, 이진 변형
- 문제?
- JSON과 XML은 텍스트 형식이라서 사람이 읽을수 있고 기계가 읽을수 있어서 인기가 많다
- JSON과 XML은 표준 라이브러리가 있어서 다른 언어에서도 읽고 쓸수 있다
- JSON과 XML은 텍스트 형식이라서 크기가 크고 이진 형식보다 느리다
- JSON과 XML은 모두 스키마를 지원한다
- CSV는 스키마가 없으므로 각 로우와 칼럼의 의미를 정의하는 작업은 애플리케이션이 해야 한다
- 이진 부호화
- 좀더 간편하고 파싱이 빠른 형식
- 문제?
스리프트와 프로토콜 버퍼
- 이진 부호화 라이브러리
- 프로토 버퍼는 구글
- 스리프트는 페이스북
- 필드태그와 스키마 발전
- 스키마 발전
- 테그번호로 상위호환 하위호환을 유지
- 데이터타입과 스키마 발전
- 불가능하진 않지만 값이 정확하지 않거나 짤릴 위험이 있다
아브로
- 하둡의 하위호환 프로젝트
- 스키마를 사용
- 스키마는 JSON으로 정의
- 쓰기 스키마 - 데이터를 쓸때 사용
- 읽기 스키마 - 데이터를 읽을때 사용
- 두개의 스키마가 동일하지 않아도 되며 호환가능하면 된다
- 스키마 발전 규칙
- 호환성을 유지하기 위해서 기본값이 있는 필드만 추가하거나 삭제할수 있다
- 필드에서 널을 허용하려면 유니온 타입을 사용해야 된다
- 동적 생성 스키마
- 코드 생성과 동적 타입언어
스키마의 장점
- 유효성 검사를 지원
- 문서화
- 코드 생성
- 데이터베이스 스키마를 유지하면 스키마 변경이 적용되지 전에 상위 호환성과 하위 호환성을 확인할 수 있다
데이터플로 모드
- 데이터베이스를 통한 데이터플로
- 다양한 시점에 기록된 다양한 값
- 데이터가 코드보다 더 오래 산다
- 마이그레이션은 값비싼 작업이다
- 보관 저장서
- 데이터베이스 스냅샷
- 다양한 시점에 기록된 다양한 값
- 서비스를 통한 데이터플로: REST와 RPC
- 서비스 지향 설계
- 마이크로서이스 설계
- 웹서비스
- REST
- HTTP 프로토콜
- SOAP
- XML, WSDL, XSD
- REST
- RCP 문제
- 서비스가 다운되면 클라이언트도 다운된다
- 서비스가 다운되면 클라이언트가 다운되지 않더라도 서비스를 사용할수 없다
- RCP의 현재 방향
- 서비스 디스커버리
- 데이터 부호화와 RPC의 발전
- 클라인언트와 서버를 독립적으로 변경하고 배포할수 있어야 된다
- 요청은 하위호환성만 필요
- 응답은 상위 호환성만 필요
- 메시지 전달 데이터플로
- 비동기 메시지 전달 시스템
- 메시지 브로커
- 상용에서 오픈소스로 바뀜
- 메시지 큐
- 메시지 브로커
- 분산 액터 프레임워크
- 엑터 모델
- 엑터 모델은 단일 프로세스 안에서 동시성을 위한 프로그래밍 모델이다
- 스레드를 직접 처리하는 대신 액터에 캡슐화 된다
- 보통 하나의 액터는 하나의 클라이언트나 엔티티를 나타낸다
- 액터는 로컬 상태를 가질수 있도 비동기 메시지의 송수신으로 다른 액터와 통신한다
- 액터는 메시지 전달을 보장하지 않는다
- 각 액터 프로세스는 한 번에 하나의 메시지만 처리하기 때문에 스레드에 대해 걱정할 필요가 없고 각 액터는 프레임워클와 독립적으로 실행할 수 있다
- 엑터 모델
- 비동기 메시지 전달 시스템
정리
데이터 구조를 네트워크나 디스크 상의 바이트열로 변환하는 다양한 방법을 살펴봤다
순회식 업그레이드 하위호환성 상위 호환성