데이터 중심 애플리케이션 설계 - 12장 (끝)

공상현 (Kong Sang Hyean)·2024년 8월 13일
0

K DEVCON DDIA STUDY

목록 보기
12/12

😊 Go to Learn이란?

K-devcon에서 주최하는 멘토링 프로그래밍으로 각 분야에서 전문가이신 멘토분들의 멘토링을 통하여 약 2-3달간 진행하는 프로그램입니다.

Go to Learn 1기 같은 경우 Flutter, Back-end, Full-stack, Writing 등 여러가지 주제가 담긴 멘토링 프로그램이 있었습니다.

그 중 Back-end를 중심으로 진행하는 DDIA 프로그램 같은 경우 데이터 중심 애플리케이션 설계라는 책을 매주 1장 씩 정독하고 요약하면서 괸련된 이야기를 논의하면서 진행하고 있습니다.

K-devcon 이란? : IT 정보를 공유하거나 위에서 설명한 Go to Learn 스터디 및 밋업을 개최하는 활동을 하고있는 IT 커뮤니티입니다.
K-devcon 홈페이지 바로가기


📖 12장 요약 및 정리

데이터 통합

데이터를 사용하는 모든 다른 상황에 적합한 소프트웨어가 있을 가능성이 낮기 떄문에 원하는 애플리케이션 기능을 제공하기 위해서는 반드시 여러 다른 소프트웨어를 함께 엮어 사용해야한다.

데이터플로 : 다른 데이터 접근 양식을 만족하기 위해 같은 데이터의 사본을 여러 저장소 시스템에 유지할 때 입출력을 분명히 할 필요가 있다.

파생 데이터 대 분산 트랜잭션 : 다른 방식으로 유사한 목표를 달성한다.

  • 분산 트랜잭션은 상호 배타적인 잠금을 사용하여 쓰기 순서를 결정
  • CDC & 이벤트 소실 : 순서를 결정하는 데 로그를 사용한다.

전체 순서화의 제약 : 작은 시스템에서 이벤트 로그의 순서 전체를 보장하는 것은 가능하다.

  • 규모가 더 커지고 더 복잡한 작업부하가 발생한다.
  • 전체 순서 브로드캐스트 : 이벤트 전체 순서를 결정한다. (합의)
    • 대부분의 합의 알고리즘은 단일 노드가 전체 이벤트 스트림을 처리하기에 충분한 처리량을 가진 상황을 가정하고 설계한다.

일괄 처리와 스트림 처리 : 각 출력은 파생 데이터셋이다. (검색 색인, 구체화 뷰 등)

  • 일괄 처리와 스트림 처리의 각 차이점은 스트림 처리는 끝이 없는 데이터셋 상에서 운영되는 반면 일괄 처리는 유한한 크기의 입력을 사용한다.

파생 뷰 : 스트림 처리를 이용하면 입력의 변화를 빠르게 파생 뷰에 반영할 수 있다.

  • 누적된 상당한 양의 과거 데이터를 재처리해 기존 데이터셋을 반영한 새 파생 뷰를 만들 수 있다.
  • 파생 뷰를 사용하면 점진적 발전이 가능하다.

람다 아키텍처 : 입력 데이터를 불변 이벤트로서 증가하지만 하는 데이테셋에 추가하는 방식으로 기록해야 한다는 것으로 이벤트 소싱과 유사하다.

  • 데이터 시스템 설계를 향상시키는 데 영향을 준 아이디어이지만 실질적 문제가 있다.

데이터베이스 언번들링

유닉스와 관계형 데이터베이스는 정보 관리 문제를 각기 매우 다른 철학으로 접근하였다. 유닉스는 논리적이지만 하드웨어 추상화를 제공하였던 반면 관계형 데이터베이스는 복잡성을 감추는 추상화를 제공하였다.

데이터베이스가 제공하는 다양한 기능

  • 보조 색인은 필드 값을 기반으로 레코드를 효율적으로 검색할 수 있는 기능
  • 규체화 뷰는 질의 결과를 미리 연산한 캐시의 일종
  • 복제 로그는 데이터의 복사본을 다른 노드에 최신 상태로 유지하는 기능
  • 전문 검색 색인은 텍스트에서 키워드 검색을 가능하게 하는 기능

연합 데이터베이스 & 언번들링 데이터베이스

  • 연합 데이터베이스 : 읽기를 통합
    • 엄청나게 많은 하단 저장소 엔진과 처리 메서드를 통합해 질의라는 인터페이스를 제공한다.
  • 언번들링 데이터베이스 : 쓰기를 통합
    • 저장소 시스템들을 신뢰성 있게 결합하기 쉽게 만드는 것은 데이터베이스의 색인 유지 기능을 다른 기술에 걸친 쓰기를 동기화할 수 있는 방식
    • 하나만 잘하는 작은 도구를 사용하는 유닉스 전통을 따른다.

데이터플로 주변 애플리케이션 설계 : 데이터플로 언어 / 함수형 반응형 프로그래밍 / 논리적 프로그래밍

  • 데이터플로 측면에서 파생 데이터를 유지하는 것이 전통적인 메시징 시스템의 설계 목적인 비동기 작업 실행과는 같지 않다는 것이다.
    • 파생 데이터를 유지할 때 상태 변경 순서가 중요할 때가 있다.
    • 내결함성은 파생 데이터의 핵심이다. 메시지 전달과 파생 상태 갱신 양쪽 모두 반드시 신뢰성이 있어야 한다.

파생 상태 관찰

  • 쓰기 경로 : 데이터플로 시스템은 검색 색인이나 구체화 뷰 & 예측 모델과 같은 파생 데이터셋을 생성하고 최신 상태로 유지하는 과정에서 사용할 수 있다.
  • 읽기 경로 : 사용자 요청을 처리할 때 먼저 파생 데이터셋을 읽고 그 결과를 어느 정도 가공한 후 사용자 응답을 만든다.
  • 쓰기 경로로 색인을 갱신하고 읽기 경로로 색인을 사용하여 키워드를 찾을 수 있는 전문 검색 색인은 좋은 예제이다. -> 각 단어의 동의어 중 어떤 것이든 포함하는 문서를 찾기, 위해 불 논리를 적용

정확성

모두가 신뢰성 있고 정확한 애플리케이션을 구축하기 원한다. (원자성, 격리성, 지속성 등)

연산자의 정확히 한 번 실행

  • 내결함성에서 정확히 한 번 시맨틱을 설명 : 메시지 처리 중 뭔가 잘못 되었다면 포기하거나 재시도 할 수 있다.
    • 정확히 한 번은 연산이 어떤 결함 때문에 실제로 연산자를 재시도했더라도 최종적으로 얻기 위해 계산을 조정한다는 뜻
    • 위의 목표를 달성하기 위해 가장 효과적인 접근법 중 하나는 연산을 멱등으로 만드는 것이다.

중복 억제 : 스트림 처리 외에도 많은 곳에서 동일한 중복 제거 패턴이 발생한다. (TCP 등)

  • 중복 억제는 단지 단일 TCP 연결 문맥 내에서만 작동한다.
    • 클라이언트가 COMMIT를 전송한 후 해당 연결에 타임아웃이 발생했으나 DB 서버로부터 응답을 받지 못했을 경우
    • 2단계 커밋은 TCP 연결과 트랜잭션 간의 일대일 대응 관계를 꺤다 그러나 트랜잭션이 한 번만 실행되도록 보장하기에는 충분치 않다.

종단 간 논증

  • 중복 트랜잭션 억제 시나리오는 일반적인 원리의 한 예이다. 그 중 중복 억제 기능이 문제의 기능이다.
    • TCP, 데이터베이스 트랜잭션, 스트림 처리 자체만으로 이러한 중복 문제를 해결할 수 없다.
    • 따라서 종단 간 해결책이 필요하다. -> 모든 경로에 트랜잭션 식별자를 포함하는 방법
  • 데이터 무결성 검사에도 적용할 수 있다. -> 모든 곳에서 데이터 손상을 발견하기 위해 종단 간 체크섬도 요함

전체 순서 브로드캐스트 : 로그는 모든 소비자가 동일한 순서로 메시지를 보도록 보장한다. (합의와 동일하다.)

  • 스트림 처리자는 단일 스레드 상에서 한 로그 파티션의 모든 메시지를 순차적으로 소비한다.
  • 유일성이 필요한 값을 기준으로 로그를 파티셔닝하면 스트림 처리자는 충돌이 발생한 연산을 결정적으로 판결할 수 있다.

적시성과 무결성

  • 적시성 (Timeliness) : 사용자가 시스템을 항상 최신 상태로 관측 가능하다는 의미이다.
  • 무결성 (Integrity) : 누락된 데이터도 없고 모순된 데이터도, 잘못된 데이터도 없다는 의미이다. (손상이 없다.)

데이터플로 시스템의 정확성

  • ACID 트랜잭셩의 관점에서 애플리케이션 정확성을 접근한다면 직시성 및 무결성을 따로 구별하는 것은 중요하지 않다. 하지만 데이터플로 시스템 관점에서의 속성 중 하나가 적시성 및 무결성을 구별하는 것이다.
  • 정확히 한번 & 결과적으로 한 번 시멘틱은 무결성을 보존하는 매커니즘이다.
    • 이벤트 소싱 / 결정적 파생 함수
    • 클라이언트가 생성한 요청 ID를 모든 처리 관계를 통해 전달
    • 메시지를 불변으로 만들고 필요시 파생 데이터 처리

완화된 유일성 개념 : 유일성 제약 조건의 형태가 필요하다면 제한을 피할 수 없다. 그러나 완화된 유일성 개념을 사용하여 위의 제한을 피할 수 있다.

  • 보상 트랜잭션 : 동시에 같은 요청이 들어오면 다른 하나는 실패 메시지를 보내는 변경 방법이다.
  • 비즈니스의 경우 위의 방법을 통하여 사과 비용이 수용할 만한지의 여부는 비즈니스적 결정 사안이다.
  • 위의 애플리케이션은 무결성을 반드시 요구하지만 제약 조건을 강제하는 상황에서도 적시성은 반드시 필요한 것이 아니다.

코디네이션 회피 시스템 : 동기식 코디네이션이 필요한 시스템보다 성능이 더 좋고 더 나은 내결함성을 지닌다.

  • 이러한 데이터플로 시스템은 코디네이션이 없이도 무결성을 강력하게 보장한다.
  • 이러한 맥락에서 직렬성 트랜잭션은 파생 상태를 유지하는데 부분적으로 유용하다.

😉 필자의 생각

마지막 장인 12장은 지금까지 설명한 주제들을 정리하여 저자가 개인적으로 생각하고 있었던 것들을 설명해주었던 것이 메인이였었다. 그 뿐만 아니라 기술적인 이야기 외에도 데이터 처리에 관한 윤리적인 이야기도 기술되어 있었다. 요즘 발생하는 이슈들을 보면 꽤 중요한 내용들이 많이 들어가있었다.

마지막 스터디이기 때문에 그 동안 배운 것을 토대로 다른 회사에서는 어떻게 적용하는지에 대한 이야기를 듣게되는 시간이 있었다. 적용 내용 및 시행착오를 보고 데이터를 좀 더 효과적이게 처리하기 위해서 느 만큼 노력이 필요하다는 것을 알게 되었다.

마지막으로 위 책을 읽으면서 평소 업무에서 구경조차 하지 못하였던 분산 처리 및 비관계형 데이터 등 데이터 처리와 관련한 여러 이슈들에 대해 알아보는 시간이었던 것 같다. 위 책을 읽으면서 내용을 정리하는 것만으로 끝내기엔 아쉬워서 위의 주제랑 관련하여 많은 것들을 시도 할 예정이다. 당장 관련 자격증 공부 중에서도 스트림 서비스 및 데이터 베이스 처리 서비스 설명 같은 경우 위에서 알아내었던 용어 및 개념이 많이 나오고 있어서 이해가 쉽게 되어지거나 여러 예시 시나리오 등을 알 수 있었다.

profile
개발자 같은 거 합니다. 1인분 하는 개발자로서 살아갈려고 노력 중입니다.

0개의 댓글