피드로 돌아가기
올리브영 테크블로그Backend
원문 읽기
올영세일 선착순 쿠폰, 미발급 0%를 향한 여정
올리브영이 선착순 쿠폰 발급 시스템의 이중 카운터 전략으로 미발급률 0.014%에서 0%로 단축하면서 성능 저하 8%에 억제
AI 요약
Context
올리브영 쿠폰 시스템은 RabbitMQ 기반 비동기 처리로 대량 트래픽을 감당했으나, 2025년 6월 올영세일 7일간 평균 0.014%의 미발급률(10,000건당 1.4건)이 발생했다. 사용자에게 발급 성공으로 응답했지만 워커의 2차 유효성 검사에서 실패하는 문제로 고객 신뢰도 하락과 CS 비용 증가를 야기했다.
Technical Solution
- 1차 시도: 발급 수량 선차감: 온라인몰 앞단에서 Redis 수량을 먼저 차감해 Time Gap 단축, 발급 실패 시 Rollback 로직 구현
- 2차 시도: Lua 스크립트 적용: Redis GET/INCR 명령을 원자적으로 처리해 Race Condition 차단 (기각 사유: 21% 성능 저하)
- 최종 선택: 이중 카운터 전략: C001-count(최종 발급 제한 수량) 키와 C001-countReq(발급 요청 수량) 키 2개로 유효성 검사 이중화
- Redis 키 관리: 쿠폰 종료 시간 기준 +1시간 TTL 설정으로 적절한 라이프사이클 관리
- 모니터링·대응 체계: count vs countReq 정합성 지속 모니터링, 임계치 초과 시 즉시 알람, Redis 장애 시 DB 기반 Fallback 전략
Impact
- 부하 테스트 결과(제한 수량 10,000건 기준): 발급 정확도 100% 달성, 미발급 건수 162건 → 0건
- 미발급률 1.62% → 0% 완전 해소
- 실제 운영 환경에서 9월 올영세일 4일차부터 미발급 건수 0건 지속, 분당/초당 최대 처리량 안정적 유지
- 성능 저하: 8% (Lua 스크립트의 21% 대비 대폭 감소)
Key Takeaway
비동기 시스템에서 응답 속도와 데이터 정합성은 기본적 트레이드오프이지만, 이중 카운터처럼 시스템 특성에 맞춘 우아한 설계로 둘 다 확보할 수 있다. 선착순 같은 높은 신뢰도가 요구되는 도메인에서는 정확성 100% 확보와 성능 임계값 내 트레이드오프를 균형있게 조정하는 의사결정이 핵심이다.
실천 포인트
Redis를 활용한 선착순 또는 제한 수량 기반 발급 시스템에서, 동시 요청으로 인한 경합 상태를 방지하려면 실제 수량 제어 키와 요청 수량 제어 키를 분리하는 이중 카운터 전략을 도입하면 Lua 스크립트 없이도 원자성 보장 없이도 정확성 100%를 확보하면서 성능 저하를 8% 이내로 제한할 수 있다.