피드로 돌아가기
올리브영 결제 이야기 Part - 3
올리브영 테크블로그올리브영 테크블로그
Backend

올리브영 결제 이야기 Part - 3

올리브영이 주문 결제 트랜잭션을 Item별 개별 단위로 분리하여 데드락 발생 제거 및 고트래픽 상황에서 안정적인 주문 처리 달성

2022년 12월 13일9intermediate

Context

올리브영 주문 결제 시스템은 재고 확인, 결제 금액 검증, 결제 처리, 재고 차감, 배송 정보 처리, 주문 완료 정보 생성 등 다수의 프로세스를 하나의 트랜잭션으로 통합 처리했다. 동시 다중 사용자가 동일 데이터에 접근할 때 DB Lock으로 인한 순차 처리가 발생했고, 여러 트랜잭션이 서로 다른 데이터에 대해 순환 대기하는 데드락이 빈번하게 발생하여 시스템 리소스 고갈 및 응답 시간 증가로 이어졌다.

Technical Solution

  • 단일 트랜잭션을 상품별 개별 트랜잭션으로 분리: Item A와 Item B의 처리를 독립적으로 Commit하도록 변경하여 각 트랜잭션의 Lock 점유 시간 단축
  • 트랜잭션 다중화 전략 적용: 1+1 상품, 증정품, 예약상품, 프로모션 상품 등 다양한 속성의 상품들에 대해 각각 처리 로직을 분리하고 롤백 시나리오를 개별 반영
  • 데드락 재현 및 검증: JMeter를 활용해 순간 트래픽 시뮬레이션으로 기존 구조의 데드락 발생 패턴 확인 후 개선 구조에서의 안정성 검증
  • 단계적 부하 테스트: 부하 발생 장비를 확대하면서 고트래픽 환경에서의 데드락 재발 여부 확인

Impact

개선 전 JMeter 테스트에서 무수한 오류 발생 및 DB Lock 카운트 증가로 실제 데드락 발생하여 DBA 개입으로 데드락 강제 종료 필요했으며, 개선 후 테스트에서 에러 카운트 0건 및 데드락 0건 달성. 실제 운영 환경의 이벤트 트래픽 기준으로 개선 전에는 고트래픽 시 주문 처리 실패 다수 발생했으나 개선 후 높은 트래픽에서도 안정적인 주문 처리 확인.

Key Takeaway

고트래픽 환경에서 데이터 동시성 제어로 인한 데드락은 트랜잭션 범위를 최소화하고 Lock 점유 시간을 단축하는 것으로 근본 해결이 가능하다. 특히 하나의 비즈니스 트랜잭션이 여러 데이터 엔티티에 영향을 미칠 때, 각 엔티티별 독립적인 트랜잭션 처리 설계가 성능과 안정성 향상의 핵심이다.


다중 상품 구매를 처리하는 주문 결제 시스템에서 모든 상품의 재고 차감을 하나의 트랜잭션으로 통합하지 말고 상품별로 개별 트랜잭션으로 분리하면 고동시성 상황에서 데드락 발생을 제거하고 응답 시간을 안정화할 수 있다.

원문 읽기