83
AI 요약
이 글은 AI가 원문을 분석하여 핵심 내용을 요약한 것입니다.
올영세일 선착순 쿠폰 미발급 0%를 향한 정합성 개선
이 게시물은 Redis와 Message Queue 기반 비동기 쿠폰 발급 시스템에서 ‘응답은 성공인데 실제 발급은 실패’하는 미발급 문제를 0%로 낮추기 위한 개선 과정을 다룹니다.문제 상황과 비동기 구조의 한계
- 온라인몰 1차 유효성 검사 통과 후 MQ 발행, 워커가 2차 유효성 검사 및 DB 반영을 수행하는 구조에서 시간 간극(Time Gap)으로 경합이 발생
- Redis에서 GET 후 INCR을 분리 호출해 원자성이 깨지며 수량 오버플로우 및 2차 검증 실패가 발생
- 2025년 6월 행사(7일)에서 평균 미발급률 0.014%가 관측되어 고객 신뢰 및 CS 리스크로 이어짐
개선 시도와 의사결정
1) 수량 선차감
- 워커가 하던 Redis 수량 증가를 앞단에서 먼저 처리하고, 실패 시 롤백하도록 변경
- Time Gap은 줄었지만 원자성 문제가 남아 미발급이 완전히 해소되지는 않음
2) Lua 스크립트
- GET/INCR을 스크립트로 묶어 원자성을 확보해 미발급/과발급을 0으로 만들었으나, 단일 스레드 특성으로 약 21% 성능 저하가 발생
3) 이중 카운터(Double Counter)
- 실제 발급 수(count) 외에 요청 수(countReq) 키를 추가해 요청을 먼저 차단하고, 통과된 요청만 실제 카운터를 증가
- Lua 없이 경합을 줄이며 성능 저하를 약 8% 수준으로 제한
결과 및 운영 고려사항
최종적으로 ‘수량 선차감 + 이중 카운터’ 조합을 채택해 부하 테스트에서 미발급 0건(정확도 100%)을 달성했고, 실제 운영에서도 기능 플래그 ON 이후 미발급이 0건으로 확인되었습니다.또한 Redis 키 네이밍/TTL, count와 countReq 차이 모니터링, Redis 장애 시 DB 기반 폴백 및 정합성 보정 시나리오를 함께 제시합니다.


