Jmeter 테스트
결제 로직을 작성한 후 Jmeter로 테스트를 해보았다.
- Number of Threads (사용자 수): 1000
- Ramp-Up Period (래핑 업 시간): 1초
- Loop Count (루프 카운트): 1
1000명의 사용자가 동시에 실행되는데 1초 동안 1000명의 사용자가 시작한다.
각 사용자가 1회 반복 요청을 보내기 때문에 총 1000번 실행이 되어야 한다.
Request
{
"productId" : 1,
"count" : 1,
"addressId": null
}
1번의 상품을 요청 시마다 하나씩 구매한다.
모든 requst가 성공하게 된다면 1000개의 재고가 감소되어야 한다.
그렇다면 바로 결과 확인해 보자!
결과 확인
데이터 베이스 확인
order는 999개 만들어졌는데 상품은 999개 줄어들지 않았다!
동시성 문제
여러 스레드가 한꺼번에 동일한 자원에 접근할 경우, 이러한 동시성 문제가 발생할 수 있다!
내가 진행 중인 프로젝트에서 선착순 구매를 진행하다 보면 한꺼번에 많은 사용자가 같은 시간 몰릴 것이고, 이러한 동시성 문제가 발생할 가능성이 아주 높다.
ecommerce 쇼핑몰에서는 이러한 동시성 문제를 해결해야 만한다.
동시성 문제 해결방법
synchronized
synchronized를 이용해 간단하게 해결할수 있다.
하지만 synchronized에도 한계가 있다.
- 전역 동기화
- 여러 서버에서 동시에 요청을 처리하는 경우 synchronized 메서드만으로는 동시성 문제를 해결할 수 없음
- 성능 저하
- synchronized는 동기화된 블록에 접근할 때, 한 번에 하나의 스레드만 접근할 수 있도록 보장함. 이는 높은 동시성 요구가 있는 시스템에서 성능 저하를 초래
명쾌한 해결방법이 되지 못했다.
Redis rock
Redis rock을 사용해 동시성 문제를 해결해볼까한다!
여러 사용자(스레드)가 접근 하더라도 락을 걸어서 순차적으로 진행시켜 동시성 문제를 해결할수 있다!
'프로젝트 > Springboot-MSA- PreOrder' 카테고리의 다른 글
[Project] Kafka를 사용한 비동기 이벤트 처리 (0) | 2024.09.06 |
---|---|
[Project] Redis 캐싱 성능개선 (0) | 2024.09.01 |
[Project] 서비스 장애 대응 Circuit Breaker 구현 (1) | 2024.08.26 |
[Project] API Gateway (0) | 2024.08.18 |
[Project] Spring Batch란? (0) | 2024.08.18 |