올리브영/무신사/지그재그 등 쇼핑을 즐겨하는 나인데
늘 시간 쿠폰만 받으려고 하면 그게 그렇게 어렵더라.
올리브영의 경우 12시면 11:59:45분부터 쿠폰 페이지를 누르면 대기 몇번 + 예상 시간이 생기고
지그재그의 경우는 페이지는 바로 들어가지면 결제하기 누르는 순간부터 대기가 생겨서 그런지 거기서부터 로딩이 있다가 결국 내가 받는 메세지는 "이미 품절 된 상품입니다"
ㅎㅎ
이런 대기열, 대규모 트래픽 서비스가 궁금했다.
마침 프론트 친구들과 함께한 포폴겸 토이 프로젝트를 만들기로 했는데 여기에 대규모 트래픽 예매 서비스를 넣어보기로 했다.
사용하고 싶었던 거 다 공부하면서 써보자!!
티켓팅 서비스처럼 찰나의 순간에 수만 명의 사용자가 몰리는 시스템을 설계할 때 가장 큰 고민은
"어떻게 하면 중복 결제를 막으면서도 사용자에게 짜증 나지 않는 경험을 줄 것인가?"
오늘 고민하고 정리한 핵심 설계 전략을 잊지 않게 작성한다!
1. 전체 프로세스 설계: 2단계 권한 분리
- 대기를 위한 만료시간과 좌석 선점에 대한 시간이 필요한데 이 부분에 대해서는
현재 날짜를 누르면 팝업으로 예매하기 → 좌석선택 → 결제하기 이렇게 흐름이 간다.
| 단계 | 핵심 트리거 | 관리 대상 | 만료 시간(예시) | 만료 시 결과 |
| 좌석 선택 | 대기열 통과 시 | 페이지 이용 권한 | 10분 | 대기열로 재이동 |
| 결제 진행 | '결제하기' 클릭 | 좌석 임시 선점 | 5분 | 좌석 점유 해제 |
2. 동시성 제어: Redis를 활용한 "임시 선점(Lock)"
처음 실시간 좌석 공유고 websocket을 써보고 싶어서 이걸 써야지 했었는데 하단의 차이로 폴링과 reids를 이용하기로 했다.
|
3. 그렇다면 왜 Redis를 쓰는가?
가장 큰 차이는 속도와 휘발성(TTL)이다.
|
[실제 흐름]
- 사용자 A가 좌석 1번 선택 후 결제 클릭
- 서버는 먼저 Redis에 "seat:1"이라는 키가 있는지 확인
- 없다면 Redis에 "seat:1" : "occupying" 이라고 저장하고 유효시간 5분을 Lock
- 사용자 B가 좌석 1번 선택 후 결제 클릭
- 서버가 Redis를 보니 이미 "seat:1" 키가 쥰재
- 서버는 DB까지 가보지도 않고 바로 B에게 "이미 선점된 좌석입니다"라고 응답함으로써 DB 부하 방지
- 사용자 A가 결제 완료
- 그제서야 DB에 1번 좌석을 "예약 완료" 변경
- Redis에 있던 임시 키 "seat:1"은 삭제
'Projects > Side Project' 카테고리의 다른 글
| [Project] 공연 예매 시스템 대용량 트래픽 대응기: 해결 방안 설계 (V1 → V2) (0) | 2026.02.03 |
|---|---|
| 대규모 트래픽 좌석 예매 시스템 설계②_대기열, Redis (0) | 2025.12.27 |
| [토이]데이터 마스킹/감사 라이브러리 회고: Masking Library (4) | 2025.07.09 |
| [Project01]설문조사 서비스 요구사항 및 설계 (2) | 2025.06.15 |
| 토이프로젝트 : AWS 기본 DB 세팅, Vue.js 기본 세팅 (1) | 2025.02.02 |