Notepad

핵심 내용

  • 모놀리식 지옥이 도래할 조짐과 마이크로서비스 아키텍처를 도입하여 이 지옥에서 벗어나는 방법
  • 요즘 애플리케이션에 분산 트랜잭션이 잘 어울리지 않는 이유
  • 사가 패턴을 마이크로서비스 아키텍처에 적용하여 데이터 일관성 유지
  • 코레오그래피/오케스트레이션 방식으로 사가 편성
  • 비격리 문제 조치 대책

마이크로서비스 아키텍처에서의 트랜잭션 관리

분산 트랜잭션의 필요성

  • 기존 모놀리식 엔터프라이즈 애플리케이션은 모든 요청을 하나의 DB 트랜잭션으로 처리
  • 마이크로서비스 아키텍처는 서비스마다 DB가 있기 때문에 여러 DB에 걸쳐 데이터 일관성 유지 수단 필요

분산 트랜잭션의 문제점

  • 이전에는 분산 트랜잭션을 이용하여 여러 서비스, DB, 메시지 브로커에 걸쳐 데이터 일관성을 유지
    • X/Open DTP 모델이 사실상 표준
    • 최근에 많이 사용되는 기술들의 상당수가 지원하지 않음(NoSQL DB와 Kafka 와 같은 현대 메시지브로커에서 미지원)
    • 동기 IPC 형태라서 가용성이 떨어짐

데이터 일관성 유지: 사가

  • 사가 패턴
    • 사가는 비동기 메시징을 이용하여 편성한 일련의 로컬 트랜잭션
    • 서비스 간 데이터 일관성은 사가로 유지
  • ACID 트랜잭션과 차이점
    • ACID 트랜잭션에 있는 격리성(I)가 사가에는 없음
    • 사가는 로컬 트랜잭션마다 변경분을 커밋하므로 보상 트랜잭션을 걸어 롤백해야함

사가 편성

  • 코레오그래피
    • 의사 결정과 순서화를 사가 참여자에게 맡김
    • 사가 참여자는 주로 이벤트 교환 방식으로 통신
  • 오케스트레이션
    • 사가 편성 로직을 사가 오케스트레이터에 중앙화
    • 사가 오케스트레이터는 사가 참여자에게 커맨드 메시지를 보내 수행할 작업을 지시

코레오그래피 사가

  • 확실한 이벤트 기반 통신
  • 장단점
    • 장점
      • 단순함
      • 느슨한 결함
    • 단점
      • 이해하기 어려움
      • 서비스 간 순환 의존성
      • 단단히 결함될 위험성

오케스트레이션 사가

  • 장단점
    • 장점
      • 의존 관계 단순화
      • 낮은 결함도
      • 관심사를 더 분리하고 비즈니스 로직을 단순화
    • 단점
      • 비즈니스 로직을 오케스트레이터에 너무 많이 중앙화하면 똑똑한 오케스트레이터 하나가 깡통 서비스에 일일이 할 일을 지시 모양새가 될 수 있음

피격리 문제 처리

  • 사가는 격리성이 빠져 있어 실제로 사가의 한 트랜잭션이 커밋한 변경분을 다른 사가가 즉시 바라볼 수 있어 문제 야기
    • 문제점 2가지
      • 한 사가가 실행 중에 접근하는 데이터를 도중에 다른 사가가 바꿔치기 할 수 있음
      • 한 사가가 업데이트를 하기 이전 데이터를 다른 사가가 읽을 수 있어서 데이터 일관성이 깨질 수 있음

비정상 개요

  • 소실된 업데이트: 한 사가의 변경분을 다른 사가가 미처 못 읽고 덮어 씀
  • 더티 읽기: 사가 업데이트를 하지 않은 변경분을 다른 트랜잭션이나 사가가 읽음
  • 퍼지/반복 불가능한 읽기: 한 사가의 상이한 두 단계가 같은 데이터를 읽어도 결과가 달라지는 현상(다른 사가가 그 사이 업데이트 했기 때문에)

비격리 대책

  • 시맨틱 락: 애플리케이션 수준의 락
  • 교환적 업데이트: 업데이트 작업은 어떤 순서로 실행해도 되게끔 설계
  • 비관적 관점: 사가 단계 순서를 재조정하여 비즈니스 리스크를 최소화
  • 값 다시 읽기: 데이터를 덮어 쓸 때 그 전에 변경된 내용은 없는지 값을 다시 읽고 확인하여 더티 쓰기를 방지
  • 버전 파일: 순서를 재조정할 수 있게 업데이트를 기록
  • by Value: 요청별 비즈니스 위험성을 기준으로 동시성 메커니즘을 동적 선택

참고

  • 마이크로서비스 패턴 자바(저 : 크리스 리처드슨)

'dev > 아키텍처' 카테고리의 다른 글

마이크로서비스 패턴(6)  (0) 2022.03.31
마이크로서비스 패턴(5)  (0) 2022.03.24
마이크로서비스 패턴(3)  (0) 2022.03.03
도메인 주도 설계(Domain-Driven Design)  (0) 2022.02.24
마이크로서비스 패턴(2)  (0) 2022.02.17
profile

Notepad

@Apio

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!