인프런 커뮤니티 질문&답변

강민님의 프로필 이미지
강민

작성한 질문수

실습으로 배우는 선착순 이벤트 시스템

쿠폰 개수를 증가시키는 코드에서 궁금한 점이 있습니다.

작성

·

164

0

public Long increment() {
    return redisTemplate
            .opsForValue()
            .increment("coupon_count");
}

----------------------------------------------------

public void apply(Long userId) {
    Long count = couponCountRepository.increment();

    if (count > 100) {
        return;
    }

    couponRepository.save(new Coupon(userId));
}

코드에서 쿠폰을 100개 발급할 수 있도록 했는데

만약 동시에 100만 개의 요청이 들어오게 되면 redis에도 똑같이 100만 번의 요청이 가서 100개의 요청을 제외한 나머지 불필요한 요청을 redis가 처리해야 되는 문제가 발생할 것 같습니다.

public void apply(Long userId) {

    Long count = couponCountRepository.getCount();

    if (count > 100) {
        return;
    }

    couponCountRepository.increment();

    couponRepository.save(new Coupon(userId));
}

그래서 쿠폰 개수를 먼저 가져와서 검증 후 개수를 올리게 되면 또다시 Race Condition이 발생할 것 같습니다.

실무에서는 어떠한 방식으로 코드를 작성하시는지 궁금합니다!

답변 1

0

최상용님의 프로필 이미지
최상용
지식공유자

강민님 안녕하세요.
말씀해주신 방법대로 하게된다면 race condition 이 발생할 수 있습니다.

1차로 먼저 가져온 후 100개 이상이라면 return 하고 100개 이하라면 increment 한 후 결과값을 재검증하는 방식으로 사용한다면 불필요한 요청을 최소화 할 수 있을 것 같습니다.

감사합니다.

강민님의 프로필 이미지
강민

작성한 질문수

질문하기