현재 시스템의 병목 구간
현재 시스템은 "데이터 정합성"을 최우선으로 하여, RDBMS의 비관적 락에 의존함.
이에 따라 다음과 같은 문제가 발생함.
- 비관적 락의 한계
- 모든 요청은 DB의 특정 Row 하나를 잡기 위해 대기함.
- Blocking I/O
- 락을 획득할 때까지 스레드가 대기
- 이는
DB Connection Pool 고갈 → 사용자 요청 스레드 대기 → 전체 시스템 처리량 저하 로 이어짐
발생 가능한 위험 시나리오
-
재고 1만개, 유저 10만명 같은 상황 → 주문 예약 서비스가 DB 커넥션을 모두 점유
- 현재 TPS 로는 품절까지 수 분 소요 예상.
- 후순위 유저는 대기 시간이 상당히 늘어남.
- 이에 따라 Timeout 발생 → 유저 이탈 등의 문제 발생
- 연관 없는 기능들도 DB 접속 불가로 전체 서비스 마비 가능.
-
유저의 새로고침 연타
- 응답이 늦자 유저가 재요청(새로고침 or 주문 연타)
- 기존 요청은 DB 락 대기 중이고, 신규 요청이 또 스레드를 점유함.
-
빈 재고 조회하는 문제 (?)
- 재고가 0 인 상황에도 비관적 락을 잡고 쿼리를 날리는 중.
참고