Description
Please describe the feature to be implemented.
현재 쿠폰 발급 로직은 CouponEntryRedisCounter(INCR)와 CouponRedisDuplicateValidate(SADD)가 각각 별도의 Redis 명령으로 실행되고 있습니다. 이로 인해 다음과 같은 원자성 결여 문제와 성능 저하가 발생할 가능성이 있습니다.
- 원자성 깨짐:
SADD를 통해 사용자의 중복 참여를 막았으나, INCR 호출 직전 애플리케이션 장애나 네트워크 타임아웃이 발생할 경우, 보상 트랜잭션이 실행되지 못합니다. 결과적으로 사용자는 참여한 것으로 기록되어 재시도가 불가능하지만, 실제 쿠폰 발급 카운트는 증가하지 않는 데이터 불일치가 발생합니다.
- Network RTT 비용: 발급 요청 1회당 Redis와 최소 2번 이상의 통신을 수행하고 있어, 트래픽 폭주 시 지연 시간이 누적될 수 있습니다.
이를 해결하기 위해 Redis Lua Script를 도입하여 '중복 검사', '수량 확인', '상태 저장'을 하나의 Atomic한 연산으로 처리하고자 합니다.
- AS-IS: isFirstUser(SADD) -> Check Limit -> increment(INCR)
- TO-BE: EVAL 명령어를 사용해 Redis 내부에서 검증 및 발급 로직을 한 번에 실행
Tasks
Estimated Time
Reference
Description
현재 쿠폰 발급 로직은 CouponEntryRedisCounter(INCR)와 CouponRedisDuplicateValidate(SADD)가 각각 별도의 Redis 명령으로 실행되고 있습니다. 이로 인해 다음과 같은 원자성 결여 문제와 성능 저하가 발생할 가능성이 있습니다.
SADD를 통해 사용자의 중복 참여를 막았으나,INCR호출 직전 애플리케이션 장애나 네트워크 타임아웃이 발생할 경우, 보상 트랜잭션이 실행되지 못합니다. 결과적으로 사용자는 참여한 것으로 기록되어 재시도가 불가능하지만, 실제 쿠폰 발급 카운트는 증가하지 않는 데이터 불일치가 발생합니다.이를 해결하기 위해 Redis Lua Script를 도입하여 '중복 검사', '수량 확인', '상태 저장'을 하나의 Atomic한 연산으로 처리하고자 합니다.
Tasks
Estimated Time
Reference