본 글은 2PC와 SAGA패턴에 대해서 공부한 지식을 정리한 글입니다.
전통적인 모놀리식 아키텍처에서는 애플리케이션의 모든 기능이 하나의 애플리케이션 내에서 구현되며, 데이터베이스 트랜잭션은 단일 데이터베이스에서 처리됩니다.
이 구조에서는 트랜잭션 관리가 비교적 간단하며, commit이나 rollback을 트랜잭션의 원자성, 일관성, 격리성, 지속성(ACID 속성)을 보장하는 것이 수월합니다.
모놀리식 아키텍처의 데이터베이스는 일관된 상태를 유지하기 쉬운 반면, 애플리케이션이 커지고 복잡해지면서 성능과 유지보수에 어려움을 겪을 수 있습니다.
반면, 마이크로서비스 아키텍처(MSA)에서는 애플리케이션을 독립적인 서비스들로 나누어 개발하고 운영합니다. 각 서비스는 자신만의 데이터베이스를 가지고 있으며, 서비스 간의 트랜잭션은 분산 트랜잭션으로 처리해야 합니다.
이로 인해 데이터 일관성을 유지하는 것이 매우 중요하며, 트랜잭션 관리가 복잡해집니다. MSA에서는 다음과 같은 이유로 트랜잭션 관리가 어려워집니다.
- 분산 시스템의 복잡성
- 서비스가 서로 독립적으로 운영되므로, 트랜잭션이 여러 서비스에 걸쳐 분산됩니다. 이로 인해 트랜잭션을 원자적으로 처리하는 것이 복잡해집니다.
- 성능과 확장성의 문제
- 분산 트랜잭션을 처리할 때 성능 저하와 확장성 문제를 겪을 수 있습니다.
- 장애 복구
- 서비스 장애 발생 시 트랜잭션의 일관성을 유지하고 복구하는 것이 어려워질 수 있습니다.
여러 데이터베이스 시스템 간의 일관성을 보장하고 트랜잭션의 원자성을 유지하기 위해 다양한 패턴과 기법이 도입되었으며, 그중 SAGA 패턴과 2단계 커밋 (2PC)이 대표적입니다.
분산 트랜잭션이란❓
분산 트랜잭션은 하나의 트랜잭션이 여러 개의 데이터베이스 또는 서비스에 걸쳐 수행되는 작업을 의미합니다. 예를 들어, 여러 마이크로서비스나 데이터베이스에서 데이터를 동시에 업데이트하는 경우가 이에 해당합니다.
분산 트랜잭션의 특징은 다음과 같습니다.
1. 다중 자원
- 분산 트랜잭션은 여러 데이터베이스, 메시지 큐, 파일 시스템 등 여러 자원에서 작업을 수행합니다.
2. ACID 속성
- 분산 트랜잭션은 ACID 속성을 유지해야 하며, 이를 위해 복잡한 조정과 조율이 필요합니다.
3. 트랜잭션 코디네이터
- 트랜잭션 코디네이터는 분산 트랜잭션의 전반적인 관리와 조정을 담당합니다.
- 모든 참여 시스템이 트랜잭션의 상태를 확인하고 최종 결정을 내리도록 합니다.
4. 커밋 및 롤백
- 분산 트랜잭션은 모든 자원에서의 작업이 성공적으로 수행되거나, 실패할 경우 모든 자원에서의 작업을 롤백해야 합니다.
"트랜잭션"에 대한 설명은 아래의 포스팅에서 확인 가능합니다!▼
분산 트랜잭션의 장단점
장점
데이터 일관성 유지
- 여러 데이터베이스나 시스템에서의 트랜잭션이 일관성을 유지하며 처리될 수 있습니다. 예를 들어, 하나의 트랜잭션이 여러 데이터베이스에 걸쳐서 수행될 때 모든 데이터베이스가 동기화된 상태를 유지할 수 있습니다.
- 즉, 모두 성공하거나 모두 실패하도록 보장합니다.
자동 복구 기능
- 트랜잭션이 실패했을 경우, 분산 트랜잭션 관리 시스템이 자동으로 복구를 시도하여 데이터 일관성을 유지합니다. 이는 트랜잭션이 여러 시스템에 걸쳐 있을 때 유용합니다.
비즈니스 로직의 통합
- 여러 시스템이나 데이터베이스에서 필요한 작업을 하나의 트랜잭션으로 통합할 수 있어, 복잡한 비즈니스 로직을 보다 효과적으로 관리할 수 있습니다.
확장성
- 분산 트랜잭션을 통해 여러 시스템이 독립적으로 동작하면서도, 필요한 경우 협력하여 일관된 상태를 유지할 수 있습니다. 이를 통해 시스템의 확장성을 높일 수 있습니다.
신뢰성
- 트랜잭션의 ACID 속성을 분산 환경에서도 유지할 수 있어 시스템의 신뢰성을 높입니다. 데이터 무결성과 일관성을 유지할 수 있습니다.
단점
성능 저하
- 분산 트랜잭션은 복잡한 분산 처리 및 통신 오버헤드로 인해 성능이 저하될 수 있습니다. 특히 네트워크 지연이나 시스템 간의 데이터 전송이 성능에 영향을 미칠 수 있습니다.
복잡성 증가
- 트랜잭션을 여러 시스템에서 관리해야 하므로 시스템의 복잡성이 증가합니다. 이로 인해 시스템 설계와 구현이 더 어려워질 수 있습니다.
비용
- 분산 트랜잭션을 지원하기 위한 추가적인 소프트웨어나 하드웨어 자원이 필요할 수 있으며, 이를 위해 더 높은 비용이 발생할 수 있습니다.
데드락 및 장애 대응
- 분산 환경에서는 데드락(Deadlock) 문제나 시스템 간의 동기화 문제를 처리하는 것이 더 어렵습니다. 장애 발생 시 복구 과정도 더 복잡할 수 있습니다.
복개발 및 유지보수 어려움
- 복잡한 트랜잭션 처리와 동기화 문제로 인해 개발과 유지보수가 더 어려워질 수 있습니다. 트랜잭션이 실패하거나 지연되는 상황을 정확히 처리하기 위한 추가적인 코드와 로직이 필요합니다.
데드락(Deadlock)
➡️ 두 개 이상의 프로세스나 트랜잭션이 서로의 자원을 기다리며 무한정 대기 상태에 빠지는 상황을 의미합니다.
이로 인해모든 프로세스가 진행되지 않고 시스템 자원이 고립되며, 결과적으로 시스템 전체의 효율성이 저하됩니다.
2단계 커밋 프로토콜 (2PC, Two-Phase Commit Protocol)
2PC는 분산 트랜잭션에서 트랜잭션의 원자성을 보장하기 위해 가장 널리 사용되는 방법입니다. 이 프로토콜은 모든 참여 시스템이 트랜잭션을 커밋할 준비가 되었는지 확인하고, 트랜잭션을 성공적으로 커밋하거나 롤백하는 과정을 조정합니다.
동작 원리
1. 준비 단계 (Prepare Phase)
- 트랜잭션 관리자는 모든 참여 시스템(노드)에게 트랜잭션을 커밋할 준비가 되었는지 요청합니다.
- 각 참여 시스템은 트랜잭션을 커밋할 수 있는 상태인지 확인하고, 준비가 되었다면 '준비 완료'를 트랜잭션 관리자에게 보냅니다.
준비가 되지 않았다면 '거부'를 보냅니다.
2. 커밋 단계(Commit Phase)
- 트랜잭션 관리자는 모든 참여 시스템으로부터 '준비 완료'를 받은 경우, 모든 참여 시스템에 커밋 명령을 보냅니다.
- 하나라도 '거부'를 받은 경우, 트랜잭션 관리자는 모든 참여 시스템에 롤백 명령을 보냅니다.
SAGA 패턴
SAGA 패턴은 분산 트랜잭션에서 원자성을 보장하기 위해 보상 트랜잭션 (Compensating Transactions)을 사용하는 패턴입니다.
사가 패턴은 각 단계가 성공적으로 완료된 후 각 단계가 독립적으로 커밋됩니다.
실패한 경우에는 이전 단계의 작업을 취소하기 위해 보상 트랜잭션을 수행합니다.
SAGA 패턴을 적용한 주문 처리
주문 단계 (Order Placement)
- 사용자가 온라인 쇼핑몰에서 상품을 선택하고 주문을 합니다. 이 단계에서 주문은 여러 시스템을 통해 처리됩니다: 재고 시스템, 결제 시스템, 배송 시스템 등.
단계 1: 재고 예약 (Inventory Reservation)
- 재고 시스템에서 주문한 상품의 재고를 예약합니다. 재고가 확보되면 "재고 예약 성공" 메시지를 보내고, 그렇지 않으면 "재고 부족" 메시지를 보냅니다.
단계 2: 결제 처리 (Payment Processing):
- 결제 시스템에서 사용자의 카드에서 결제 금액을 처리합니다. 결제가 성공하면 "결제 성공" 메시지를 보내고, 실패하면 "결제 실패" 메시지를 보냅니다.
단계 3: 배송 준비 (Shipping Preparation):
- 배송 시스템에서 주문을 처리하고 배송을 준비합니다. 배송 준비가 완료되면 "배송 준비 완료" 메시지를 보내고, 실패하면 "배송 준비 실패" 메시지를 보냅니다.
보상 트랜잭션
각 단계에서 성공적으로 완료된 후에는 다음 단계로 넘어가고, 만약 중간 단계에서 실패가 발생하면 이미 완료된 단계에 대해 보상 트랜잭션을 실행합니다.
보상 트랜잭션 1: 재고 반환 (Inventory Rollback)
- 결제 단계에서 문제가 발생하여 결제가 실패하면, 이미 예약된 재고를 반환하는 보상 트랜잭션을 실행합니다.
- 이 단계는 재고 시스템에 "재고 반환" 메시지를 보내어 예약된 재고를 원래 상태로 복구합니다.
보상 트랜잭션 2: 결제 취소 (Payment Cancellation):
- 배송 준비 단계에서 문제가 발생하여 배송이 실패하면, 이미 성공적으로 결제된 경우에는 결제를 취소하는 보상 트랜잭션을 실행합니다.
- 결제 시스템에 "결제 취소" 메시지를 보내어 결제 금액을 환불합니다.
보상 트랜잭션 3: 배송 취소 (Shipping Rollback):
- 만약 배송 준비가 완료된 후 문제가 발생하여 주문을 취소해야 하는 경우, 배송 시스템에 "배송 취소" 메시지를 보내어 이미 준비된 배송을 취소합니다.
'Architecture > MSA' 카테고리의 다른 글
[MSA] RabbitMQ와 Saga 패턴을 활용한 MSA의 트랜잭션 시뮬레이션 관리 및 에러 처리 (0) | 2024.08.17 |
---|---|
[MSA] 대규모 시스템에서 이벤트 소싱과 CQRS로 일관성 확보하기 (0) | 2024.08.15 |
[MSA] MSA란 무엇일까❓ (1) | 2024.07.31 |