분산 트랜잭션 처리 방안

모놀리식 환경에서는 ReservationFacade 내부에서 단일 트랜잭션으로 모든 작업을 처리하지만, MSA 환경에서는 각 서비스가 독자적인 데이터베이스를 관리하기 때문에 전체 비즈니스 프로세스의 일관성을 유지하는 것이 가장 큰 이슈가 된다.

MSA (Microservices Architecture, 마이크로서비스 아키텍처)란?

하나의 애플리케이션을 작은 독립적인 서비스들로 구성하여 운영하는 아키텍처를 의미한다.

모놀리식 아키텍처와 달리, 각각의 서비스가 독립적으로 개발, 배포, 확장될 수 있는 장점이 있다.

A. 분산 트랜잭션의 한계

  • 로컬 트랜잭션 한계: 각 서비스의 트랜잭션은 해당 서비스 내에서만 ACID를 보장하므로, 여러 서비스에 걸친 비즈니스 프로세스의 일관성은 보장하기 어려움

  • 네트워크 장애: 서비스 간 통신 실패나 네트워크 장애로 인한 데이터 불일치 문제 발생 가능

B. 해결 방안

1. 2PC (Two-Phase Commit)

코디네이터로부터 rollback 메시지(no.9)를 받으면 각각의 참여 서비스는 rollback을 진행 후 다시 이를 코디네이터에게 알린다.

  • 원리:

    • 중앙 코디네이터가 모든 참여 서비스에 준비(prepare) 요청을 보내고, 모든 서비스가 준비 완료되면 최종 커밋을 수행

    • 하나라도 실패하면 전체 롤백

  • 장단점:

    • 장점: 분산 환경에서도 원자성을 보장할 수 있음

    • 단점: 중앙 코디네이터 의존, 블로킹 문제, 응답 지연 등으로 성능 및 확장성에 한계가 있음

2. SAGA 패턴

  • 원리:

    • 전체 비즈니스 프로세스를 여러 개의 짧은 로컬 트랜잭션으로 나눈 후, 각 단계가 성공하면 다음 단계로 진행

    • 만약 한 단계에서 실패하면, 이전 단계의 작업을 취소하는 보상 트랜잭션을 수행하여 전체 프로세스의 일관성을 맞춤

  • 구분:

    • 코레오그래피 기반 : 각 서비스가 이벤트를 발행하고, 다음 서비스가 해당 이벤트에 반응하여 로컬 트랜잭션을 실행

    • 오케스트레이션 기반 : 중앙 오케스트레이터가 각 서비스에 순차적으로 명령을 내려 전체 프로세스를 관리

  • 장단점:

    • 장점: 중앙 실패 지점이 없고, 각 서비스가 독립적으로 트랜잭션을 관리할 수 있어 확장성과 장애 격리가 용이함

    • 단점: 최종 일관성(Eventual Consistency) 보장이며, 보상 트랜잭션 설계가 복잡할 수 있음

💡 이벤트 소싱(Event Sourcing)

  • 정의

    • 발생한 이벤트를 저장하는 기법

      • 상태 변화를 이벤트로 기록하고, 현재 상태를 추적하는 대신에 과거의 모든 상태 변경 이벤트를 저장하는 방식

      • DB의 상태를 직접 저장하는 것이 아니라, 데이터의 변경사항을 이벤트로 저장하여 시스템의 상태를 재구성 할 수 있음

      • 사가 패턴은 각 서비스에서 독립적으로 트랜잭션을 처리하고, 그 결과를 바탕으로 다음 트랜잭션을 이어 나가기 때문에 이 과정에서 이벤트 소싱을 사용하면 각 트랜잭션의 결과를 이벤트로 기록할 수 있다. (즉, 각 서비스는 트랜잭션 결과를 이벤트로 기록하고 그 이벤트를 사가 패턴의 다음 단계로 넘기는 방식으로 이어나갈 수 있다는의미)

  • 시나리오 예시


코레오그래피(Choreography) 기반 사가

  • 분산 통신 방식 중앙 조정 시스템 없이 각 서비스가 이벤트를 발행하고, 다른 서비스가 이를 구독하여 자신의 트랜잭션을 실행한다

  • 이벤트 기반 처리 서비스 간의 메시지 전달로 트랜잭션이 연쇄적으로 이어지며, 각 서비스는 자신의 비즈니스 로직에 따라 이벤트에 반응한다

  • 장점

    • 서비스 간 결합도가 낮아 유연한 확장이 가능

    • 중앙 관리 부하가 없으므로 시스템 전체에 분산 처리가 가능

  • 단점

    • 복잡한 트랜잭션 흐름을 추적하거나 디버깅하기 어려움

    • 이벤트 순서나 누락 등의 이슈가 발생할 수 있음

오케스트레이션(Orchestration) 기반 사가

  • 중앙 집중 제어 전용 오케스트레이터가 전체 트랜잭션의 진행을 제어하며, 각 서비스에 명령을 내려 순차적으로 로컬 트랜잭션을 실행한다

  • 명령 기반 실행 오케스트레이터가 트랜잭션의 시작부터 종료, 오류 발생 시 보상 트랜잭션까지 전체 흐름을 관리한다

  • 장점

    • 전체 프로세스의 흐름을 중앙에서 명확하게 파악하고 관리

    • 복잡한 비즈니스 로직이나 트랜잭션 순서 제어에 유리

  • 단점

    • 중앙 조정자가 장애를 일으킬 경우 전체 시스템에 영향을 줄 수 있음짐

    • 오케스트레이터에 의존하게 되어 서비스 간 결합도가 높아

Last updated