재고 차감 동시성 문제
문제 상황
🚨 주문-상품 서비스간 2PC 방식 구현 중 동일 상품에 대한 동시 주문 발생 시 재고 수량 데이터 불일치 문제 발견
JMeter 테스트 상품 재고 100개, 200번의 동시 요청
- 테스트 요청 수 - 200건
- 성공 응답 수 - 200건
- 오류율 - 0%
- 평균 처리 시간 - 167.8/sec

모든 요청을 성공으로 응답했으나 데이터베이스의 실제 데이터와 불일치가 발생
- 재고 차감 이력 테이블 : 200건 기록
- 실제 상품 재고: 79개 (21개 차감)

해결 방안 고민
❓분산락 적용 안한 이유
- 분산락은 전체 프로세스에 락을 걸어 동시성을 제어
- 상품 재고 차감은 DB에 단일 리소스 업데이트 하는 과정으로 전체 프로세스에 락을 걸 필요X
- 여러 DB서버가 존재하는게 아니고 현재 단일 DB서버 사용중
- 지금 같은 상황에서 분산락을 적용한다면 오버스팩이라고 생각
❓낙관적 락 적용 안한 이유
- 롤백 재시도 로직 구현하기 번거롭고 작성한 로직에서 추가적인 문제 발생할 수 있다
- 인기상품 구매로 동시요청이 많아질 경우 계속 충돌 발생하면서 부하발생
비관적락 적용

JMeter 테스트 상품 재고 100개, 200번의 동시 요청
- 테스트 요청 수 - 200건
- 성공 응답 수 - 100건
- 오류율 - 50%
- 평균 처리 시간 - 143.9/sec

요청 결과와 데이터베이스의 정합성 보장
- 재고 차감 이력 테이블 - 100건 기록
- 실제 상품 재고 - 0개 (초기 100개에서 모두 차감)
- 실패한 요청 - 100건 (재고 부족으로 인한 에러)

재고 롤백 스케줄러 분산락 적용
문제 상황
🚨 여러 인스턴스 환경에서 상품 재고 롤백 스케줄러 실행 시 중복 증가 문제 발생
[서버 A]
1. 조회: 재고 차감 이력 테이블(stock_decrease_history)에서 재고 차감 후 커밋되지 않은 이력 조회
2. 처리: 상품 재고 테이블(top_size_stock) 재고 증가
[서버 B]
1. 조회: 재고차감 이력 테이블(stock_decrease_history)에서 서버 A와 같은 중복 데이터 조회
2. 처리: 상품 재고 테이블(top_size_stock) 재고 증가 (이미 처리된 건에 대해서도 재고 증가 발생)

해결방안
❓비관적 락 적용 안한 이유
- 두 테이블 간의 데이터 정합성 문제 (재고 차감 이력 테이블, 상품 재고테이블)
- 비관적 락 은 해당 테이블(상품 재고) 특정 로우에만 락을 걸어 순차적인 재고 증가 문제는 해결 가능
- 하지만 재고 차감 이력 테이블(stock_decrease_history)에서 중복 데이터가 먼저 조회문제는 비관적락과 상관 X
- 두 테이블 간 조회 및 처리에 대한 작업을 비관적락으로는 해결 불가
분산락 적용
- 분산락 획득
- 트랜잭션 시작
- rollback 메서드 실행 (커밋되지 않은 이력 조회 후 재고 증가)
- 트랜잭션 종료
- 분산락 해제
- 먼저 락을 획득한 하나의 서버만 전체 프로세스 실행
- 다음 서버가 락 획득 후 프로세스 실행으로 불필요한 중복 데이터 조회 및 처리 방지

처음과 같이 중복 실행되지 않고 하나의 인스턴스에서만 롤백스케줄러를 실행하는것을 확인할 수 있다.

'이슈' 카테고리의 다른 글
중고차를 알아보다 작성하는 조회 성능 개선기 (Redis 캐싱) (0) | 2025.02.14 |
---|---|
RDB vs Elasticsearch 검색 성능 비교 (1) | 2025.01.10 |
Kafka, Redis를 활용한 이벤트 중복 처리 방지 (2) | 2024.12.19 |
[Jenkins] 용량 부족 - EBS 볼륨 연결 (1) | 2024.11.19 |
AWS EC2 배포 작업 (1) | 2023.09.07 |