쿠폰 테이블 조회 시 user_id 값
db에 등록도 잘 되었는지 확인해 보기 위해서
coupon 테이블 조회 해보았는데
[coupon_id], [user_id]
테스트 로직에서 userId 값은 단순히 for을 통해 0부터 순차적으로 받은 뒤
쿠폰 개수에 맞춰 userId 도 0~99 사이의 값이 들어 올 것이라 생각했는데
예상과 다르게 103 이라는 id가 들어왔습니다
이런 이유가 궁금합니다
답변 1
0
Sanghoon Lee 님 테스트 코드와 로직을 어떻게 작성하셨는지 공유해주실 수 있으실까요 ?
0
테스트 코드 입니다
@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





