피드로 돌아가기
How I built a flash-sale engine that can't oversell
Dev.toDev.to
Database

Aurora DSQL OCC 최적화로 오버셀링 0건, p99 42ms 달성

How I built a flash-sale engine that can't oversell

M Rayhan Khan2026년 6월 13일6advanced

Context

대규모 트래픽 환경의 선착순 판매 시스템에서 단일 카운터 기반의 업데이트 방식은 심각한 병목 현상을 유발함. 특히 Multi-region 환경의 Eventual Consistency 모델은 데이터 복제 지연으로 인한 초과 판매(Overselling) 위험을 내포함.

Technical Solution

  • Hot Row 병목 해결을 위해 단일 카운터 방식에서 개별 상품 단위의 Row 기반 모델링으로 전환
  • Aurora DSQL의 Optimistic Concurrency Control(OCC) 특성을 활용하여 쓰기 부하를 전체 키 범위로 분산 설계
  • RANDOM() 함수 기반의 후보 Row 추출과 원자적 UPDATE 문을 조합하여 Strong Consistency 확보
  • SQLSTATE 40001 에러 발생 시 Jittered Exponential Backoff 전략을 적용한 재시도 로직 구현
  • Idempotency Key 기반의 Unique Index 설정을 통해 중복 요청으로 인한 다중 결제 원천 차단
  • DSQL 제약 사항인 Foreign Key 부재와 Async Index 생성 방식을 애플리케이션 레벨에서 처리하는 스키마 설계

- 분산 DB 도입 시 해당 엔진의 동시성 제어 방식(OCC vs PCC)을 먼저 파악할 것 - 단일 카운터 업데이트가 필요한 로직을 개별 상태 Row의 점유 방식으로 변경 가능한지 검토할 것 - 네트워크 재시도 및 중복 클릭 방지를 위한 Idempotency Layer를 DB 제약 조건 수준에서 강제할 것 - Multi-region Active-Active 구성 시 Strong Consistency가 필수적인 비즈니스 로직인지 정의할 것

원문 읽기