상세 컨텐츠

본문 제목

트랜잭션의 개념과 전략

카테고리 없음

by 또또니엘 2024. 11. 15. 00:03

본문

🧐  트랜잭션?

PostgreSQL 공식 문서에서는 트랜잭션을 아래와 같이 설명하고 있다.

Transactions are a fundamental concept of all database systems. The essential point of a transaction is that it bundles multiple steps into a single, all-or-nothing operation.

트랜잭션은 모든 데이터베이스 시스템의 핵심 개념이다. 트랜잭션의 중요한 점은 여러 단계를 하나의 "전부 실행" 또는 "전혀 실행하지 않음" 방식의 작업으로 묶어 처리한다는 데 있다.

트랜잭션 흐름

트랜잭션 시작: 데이터베이스와의 작업이 시작
작업 수행: 데이터 삽입, 업데이트, 삭제 등 여러 작업이 순차적으로 실행
커밋/롤백 결정: 모든 작업이 성공적으로 완료되면 커밋하여 변경사항을 확정, 하나라도 실패하면 롤백하여 모든 변경사항을 취소
트랜잭션 종료: 트랜잭션 종료, 자원들 해제

 

🤯  MSA 환경에서의 트랜잭션

📕  SAGA 패턴

SAGA 패턴은 마이크로서비스 아키텍처에서 분산 트랜잭션을 관리하기 위한 패턴이다. 트랜잭션을 여러 단계로 나누어 각 단계가 독립적으로 성공하거나 실패할 수 있도록 한다. 각 단계에서 오류가 발생하면 이전 단계에서 수행한 작업을 취소(롤백)하여 일관성을 유지한다.

 

장점:

  1. 유연성: 마이크로서비스 간 느슨한 결합을 가능하게 하며, 각 서비스가 독립적으로 수행되므로 유연성이 높아진다.
  2. 확장성: 각 서비스가 독립적으로 동작하기 때문에 병렬 처리가 용이해지며 확장성도 높다.

단점:

  1. 복잡성 증가: 각 서비스에서 롤백 로직을 구현해야 하므로 코드가 복잡해진다.
  2. 에러 처리의 복잡성: 중간 단계에서 발생하는 에러에 대한 처리가 복잡해질 수 있다.

SAGA 패턴의 두 가지 접근 방식

 

1️⃣  Choreography

  • 각 서비스가 독립적으로 트랜잭션을 수행하고, 필요한 경우 다른 서비스에 이벤트를 전송하여 다음 작업을 수행한다.
  • 예를 들어, 주문 서비스에서 주문이 생성되면 결제 서비스에 이벤트를 전송하고, 결제가 완료되면 배송 서비스가 해당 이벤트를 받아 배송을 시작하는 방식이다.
  • 장점:서비스 간 결합도가 낮아져 독립적으로 동작할 수 있습니다.
  • 단점:서비스 수가 많아질수록 이벤트 흐름을 관리하기 어려워질 수 있습니다.

2️⃣  Orchestration

 

 

  • 중앙에서 트랜잭션의 각 단계를 관리하는 오케스트레이터(Orchestrator)가 존재한다. 오케스트레이터는 각 서비스에 트랜잭션을 요청하고 상태를 관리하며, 오류 발생 시 롤백 로직을 조정한다.
  • 장점: 중앙에서 모든 트랜잭션을 제어하므로 오류 처리와 롤백이 비교적 단순해진다.
  • 단점: 중앙 오케스트레이터에 대한 의존도가 높아져, 오케스트레이터가 병목 지점이 될 가능성이 있다.

✳️  보상 트랜잭션

보상 트랜잭션(Compensating Transaction)은 트랜잭션 처리 과정에서 발생한 오류를 해결하고 시스템의 일관성을 유지하기 위해 실행되는 "되돌리기(롤백)" 작업이다. 특히 분산 시스템이나 마이크로서비스 아키텍처에서는 각 서비스가 독립적으로 실행되고 데이터 일관성을 유지하는 것이 중요하기 때문에, SAGA 패턴과 같은 방식에서 자주 사용된다.

 

 

특징

  • 비동기적 롤백 : 분산 시스템에서는 기존의 전통적인 데이터베이스 트랜잭션처럼 모든 작업을 일괄 취소하기 어렵다. 대신, 오류가 발생한 서비스의 상태를 다른 서비스에 전달하고, 필요에 따라 취소 작업을 순차적으로 실행한다.
  • 각 서비스에서 별도로 정의 : 각 서비스는 고유의 보상 트랜잭션을 정의해야 한다. 예를 들어, 결제 서비스가 이미 처리된 결제를 취소할 수 있도록 하는 반면, 재고 서비스는 이미 출고된 상품을 다시 창고로 돌려놓는 작업을 해야 할 수도 있다.
  • 최종 일관성 보장: 보상 트랜잭션을 통해 시스템 전체가 일관된 상태로 돌아가도록 하여, 궁극적으로 데이터의 무결성을 보장한다.