트랜잭션 패턴

개발하는 구황작물·2024년 10월 24일
0

1. 2PC(2-Phase-Commit)

2단계에 거쳐 영속하는 작업

Transaction Coordinator가 위 2개의 서비스의 호출이 정상적으로 이루어지면 전체 데이터를 Commit하고, 만약 특정 서비스에 오류가 발생하면 Transaction Coordinator는 이전 쿼리의 결과를 모두 롤백 한다.

위의 방법은 DB 트랜잭션을 사용하므로 데드락이 발생할 수 있고, RDBMS 에서만 가능한 방법이다.(NoSQL의 경우 분산 트랜잭션을 지원하지 않음) 또한, Transaction Coordinator 가 맛이 가면 트랜잭션 관리를 해줄 것이 없어진다.

2. Saga 패턴

Saga 패턴은 2가지로 구분할 수 있다.

  1. Choregraphy-based SAGA
  2. Orchestration-based SAGA

Choregraphy-based SAGA

순차적으로 이벤트가 전달되면서 트랜잭션이 관리되는 방법이다.

이벤트가 RabbitMQ, Kafka 같은 메시지 큐 미들웨어를 사용하여 비동기 방식 or 분산처리 방법으로 처리된다.

순차적으로 이벤트를 발행하여 Commit 한 다음, 중간에 에러가 터지면 취소 이벤트로 롤백을 한다.

위의 경우 중간에 오류가 나면 현재 트랜잭션 상태에 대해 파악하기 어렵다는 단점이 있다.

Orchestration-based SAGA

서비스가 직접 Event를 직접 구독하지 않고, Saga Orchestrator에서 Event를 구독한 후, 각 서비스를 호출하여 트랜잭션을 관리한다.

  1. A가 Saga Orchestrator에게 트랜잭션을 시작할 것을 알린다.
  2. Orchestrator는 B Channel로 명령을 보내고 B로부터 커밋 완료 메시지를 받는다.
  3. Orchestrator는 C Channel로 명령을 보낸다.
  4. 오류가 발생하여 C는 Orchestrator로 실패 메시지를 보낸다.
  5. 이를 확인한 Orchestrator는 B Channel에게 보상 트랜잭션을 하라는 명령을 내린다.
profile
어쩌다보니 개발하게 된 구황작물
post-custom-banner

0개의 댓글