분산 트랜잭션 설계
모놀리식 아키텍처에서 주문 처리 로직을 구현할 때, 각 단계가 성공적으로 완료되어야 전체 주문이 성공적으로 처리됩니다. 그러나 외부 API를 호출하는 경우, 트랜잭션 롤백이 로컬 데이터베이스 트랜잭션과 다르게 처리됩니다. 이를 고려하여 롤백 로직을 정리해보겠습니다.
- 주문 처리 로직
- 주문서 조회
- 결제 요청
- 배송 요청
- 재고 감소 요청
- 장바구니 비우기
- 문제 상황
- 재고 감소 요청에서 에러 발생 시:
- 결제 요청과 배송 요청은 이미 완료되어 데이터가 저장된 상태입니다.
- 로컬 트랜잭션은 외부 API 호출에 대해 일관성을 보장하지 않기 때문에, 재고 감소 요청이 실패하면 이전 단계에서 성공한 결제 요청과 배송 요청에 대해 롤백 처리를 해야 합니다.
- 해결 방안
- 주문 처리의 각 단계가 원자적으로 수행되지 않음:
- 외부 API 호출이 포함된 경우, 로컬 트랜잭션으로 전체 작업을 관리할 수 없습니다.
- 따라서, 각 단계가 독립적으로 성공 또는 실패할 수 있으며, 실패 시에는 명시적으로 롤백 요청을 처리해야 합니다.
- 롤백 요청 구현 필요:
- 재고 감소 요청이 실패할 경우, 다음과 같은 롤백 처리를 구현해야 합니다:
- 이미 완료된 결제 요청을 취소 (결제 취소 API 호출)
- 이미 완료된 배송 요청을 취소 (배송 취소 API 호출)
- 정리된 설명
주문 처리 로직을 모놀리식 아키텍처에서 구현할 때, 외부 API 호출로 인해 발생하는 문제를 해결하기 위해 다음과 같은 접근 방식을 사용해야 합니다:
- 주문서 조회: 주문서 정보를 조회합니다.
- 결제 요청: 결제 API를 호출하여 결제를 요청합니다. 결제가 성공적으로 완료되면 데이터베이스에 결제 정보를 저장합니다.
- 배송 요청: 배송 API를 호출하여 배송을 요청합니다. 배송 요청이 성공적으로 완료되면 데이터베이스에 배송 정보를 저장합니다.
- 재고 감소 요청: 재고 감소 API를 호출하여 재고를 감소시킵니다.
- 만약 재고 감소 요청이 실패하면, 이미 저장된 결제와 배송 요청을 롤백해야 합니다.
- 장바구니 비우기: 주문이 성공적으로 완료되면 장바구니를 비웁니다.