리얼리즘 E2E를 구현하기 위한 기술 스택:
| 구분 | 기술 스택 | 선정 이유 (Why?) |
|---|---|---|
| Frontend | React (Next.js?) | • ? |
| Socket.io | • 대기열 순번, 좌석 매진 현황(Agent 경쟁)을 실시간으로 반영하기 위해 사용 | |
| Backend | NestJS | • TypeScript 기반의 안정적인 서버 구축 |
| • 모듈형 아키텍처로 유지보수 용이 및 Socket.io와의 높은 호환성 | ||
| Redis | • RDB의 디스크 I/O 부하를 줄이고, **In-memory 기반의 초고속 대기열 시스템(Sorted Set)**과 분산 락구현 | |
| Database | PostgreSQL or MySQL | • 최종 예매 결과, 작품 정보 저장 위한 관계형 데이터베이스(RDBMS) |
| Infra | NCP / Docker | • 컨테이너 기반의 유연한 배포 및 스케일링 환경 구성 |
**대량의 트래픽을 제어하는 '입구(Netfunnel)'**와 **데이터 정합성을 지키는 '코어 로직'**으로 나뉨
graph TD
%% 스타일 정의
classDef client fill:#e1f5fe,stroke:#01579b,stroke-width:2px;
classDef network fill:#fff3e0,stroke:#e65100,stroke-width:2px;
classDef backend fill:#e8f5e9,stroke:#1b5e20,stroke-width:2px;
classDef worker fill:#f3e5f5,stroke:#4a148c,stroke-width:2px;
classDef data fill:#fffde7,stroke:#fbc02d,stroke-width:2px;
%% 1. 클라이언트 레이어 - 사용자
subgraph Client_Layer ["🖥️ 클라이언트 계층"]
direction LR
User[사용자 브라우저 - Next.js App]:::client
end
%% 2. 네트워크 진입점 - Ingress
subgraph Network_Layer ["☁️ 네트워크 진입점 - NCP"]
CDN[NCP CDN - 정적 자산]:::network
LB[Load Balancer? - NCP LB]:::network
end
%% 3. 백엔드 서비스 - Core Logic
subgraph Backend_Layer ["⚙️ 백엔드 서비스 - NestJS"]
API_Main[API 서버 - 비즈니스 로직]:::backend
Socket_Svc[소켓 게이트웨이 - 실시간 통신]:::backend
end
%% 4. 데이터 저장소 - Storage
subgraph Data_Layer ["💾 데이터 저장소 계층"]
Redis_Cluster{{"Redis Cluster"}}:::data
subgraph Redis_Details ["Redis 사용 용도"]
R_Queue[대기열 - Sorted Set]
R_Lock[동시성 제어 - Lock]
R_PubSub[이벤트 전파 - Pub/Sub]
end
DB_Main[("MySQL - 핵심 데이터")]:::data
end
%% --- 연결 관계 - Flow ---
%% 1. 정적 자원 요청 (화살표 방향: CDN이 사용자에게 제공)
CDN -.->|정적 파일 제공| User
%% 2. API 및 소켓 연결
User <==>|HTTP - Socket.io| LB
LB ==> API_Main
LB ==> Socket_Svc
%% 3. API 서버 로직
API_Main -->|1. 대기열 진입 - 조회| R_Queue
API_Main -->|2. 좌석 선점 - Lock| R_Lock
API_Main -->|3. 예매 내역 저장| DB_Main
%% 4. 소켓 서버 - 실시간성
Socket_Svc <-->|이벤트 구독| R_PubSub
%% Redis 내부 연결 표현 - 논리적
Redis_Cluster --- Redis_Details
[아키텍처의 핵심 포인트]
ServerTime)을 받아오고, (응답시간 - 요청시간) / 2를 더해 네트워크 지연(Latency) 오차를 보정합니다.
문제점: 비대칭 상황, 업/다운 속도가 크게 차이나면 오차가 커짐..
여러 번 측정하여 튀는 값 제거 (Sampling & Averaging)
네트워크 상태는 순간적으로 불안정할 수 있으므로
Score(타임스탬프)와 Value(유저ID)로 저장SETNX key:seat_A-12 value:userID 명령을 보냄1(성공)을 반환하고 나머지는 0(실패)을 반환