inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Consumer 사용하기

쿠폰 테이블 조회 시 user_id 값

해결된 질문

251

Sanghoon Lee

작성한 질문수 5

0

db에 등록도 잘 되었는지 확인해 보기 위해서

coupon 테이블 조회 해보았는데

[coupon_id], [user_id]

테스트 로직에서 userId 값은 단순히 for을 통해 0부터 순차적으로 받은 뒤
쿠폰 개수에 맞춰 userId 도 0~99 사이의 값이 들어 올 것이라 생각했는데

예상과 다르게 103 이라는 id가 들어왔습니다
이런 이유가 궁금합니다

java docker spring-boot kafka redis

답변 1

0

최상용

Sanghoon Lee 님 테스트 코드와 로직을 어떻게 작성하셨는지 공유해주실 수 있으실까요 ?

0

Sanghoon Lee

테스트 코드 입니다

@Test
public void 여러명응모() throws InterruptedException {
    int threadCount = 1000;
    ExecutorService executorService = Executors.newFixedThreadPool(32);
    CountDownLatch latch = new CountDownLatch(threadCount);

    for (int i = 0; i < threadCount; i++) {
        long userId = i;
        executorService.submit(() -> {
            try {
                applyService.apply(userId);
            } finally {
                latch.countDown();;
            }
        });
    }
    latch.await();

    Thread.sleep(10000);

    long count = couponRepositroy.count();

    assertThat(count).isEqualTo(100);
}

 

ApplyService

@Service
public class ApplyService {

    private final CouponRepositroy couponRepositroy;

    private final CouponCountRepository couponCountRepository;

    private final CouponCreateProducer couponCreateProducer;

    private final AppliedUserRepository appliedUserRepository;

    public ApplyService(CouponRepositroy couponRepositroy, CouponCountRepository couponCountRepository, CouponCreateProducer couponCreateProducer, AppliedUserRepository appliedUserRepository) {
        this.couponRepositroy = couponRepositroy;
        this.couponCountRepository = couponCountRepository;
        this.couponCreateProducer = couponCreateProducer;
        this.appliedUserRepository = appliedUserRepository;
    }

    public void apply(Long userId) {
        Long apply = appliedUserRepository.add(userId);

        if (apply != 1) {
            return;
        }

        // lock start
        Long count = couponCountRepository.increment();

        if (count > 100) {
            return;
        }

        couponCreateProducer.create(userId);
        // lock end
    }
}

 

AppliedUserRepository

@Repository
public class AppliedUserRepository {

    private final RedisTemplate<String, String> redisTemplate;

    public AppliedUserRepository(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public Long add(Long userId) {
        return redisTemplate
                .opsForSet()
                .add("applied_user", userId.toString());
    }
}

1

최상용

Sanghoon Lee 님 안녕하세요.
답변이 늦어져서 죄송하다는 말씀 먼저 드립니다.

여러개의 스레드풀을 이용하여 병렬적으로 실행하면 실행하는 순서가 보장되지 않습니다.
예를들어 1~100 번의 id 를 가진 유저가 먼저 요청하지만 먼저 실행이 된다는 보장은 없습니다.

해당 내용에 대해 궁금하시다면 멀티스레드에 대해 공부해보시면 좋을것 같습니다!

ApplyService와 Consumer서비스의 db공유?

0

54

2

consumer가 topic을 전부 사용하기 전에 사용자에게는 쿠폰이 발급된것으로 확인하는 과정에서 발생가능한 문제.

0

72

1

쿠폰에 관련되어서 좀 더 참고할만한 자료가 있을까요?

0

83

2

흐름정리 제가 이해한게 맞나요?

0

70

2

안되서 스트레스 받아요

-2

108

2

프로젝트 진행할때 모듈로 추가하는 이유가 궁금합니다!

0

181

2

Redis 활용하기 문제점 해결하기 부분이 이해가 잘 안됩니다...

0

211

1

카프카를 도입하고 난 뒤 로그로 보여지는 장점을 발견하지 못하고 있습니다.

0

167

2

키생성 방식에 따른 성능

0

165

2

사용자 동선에 대한 트랜잭션 문의

0

134

2

강사님 강의를 듣고 실제 프로젝트에서 이벤트 응모 시스템을 만들어 봤습니다.

0

209

1

쿠폰 발급 개수 제한

0

181

2

ApplyService 의 총 처리 시간이 궁금합니다.

0

154

1

쿠폰 생성 에러 처리에 관해서 질문이 있습니다.

0

223

2

마지막에 하신 테스트 자체는 실패하는 게 맞는거죠??

0

274

2

안녕하세요 질문 있습니다!

0

293

1

쿠폰 발급 유저 흐름에 대한 질문

0

306

2

수량 조절에 대한 질문이 있습니다.

0

230

2

kafka Producer 실행 중 에러 시 redis count 정합성 이슈

0

398

2

test 과정에서 오류가 발생합니다.

0

381

1

도커 환경설정에 대해서

0

265

2

Redis의 INCR 사용 해도 Race condition이 잡히지 않는 문제

0

591

1

consumer 모듈

0

319

2

카프카 토픽 생성오류

0

378

2