목차 열기
Redis 구성
Redis는 두 개의 독립적인 인스턴스로 분리하여 운영합니다. 티켓 오픈 시 대기열 트래픽이 폭발해도 인증과 좌석 분산 락 성능에 영향을 주지 않도록 설계했습니다.
인스턴스 분리 구성
Redis #1 — Queue 전용
| Key | Type | 설명 | TTL |
|---|---|---|---|
queue:wait:{matchId} | ZSET | 대기열 사용자 순서 관리 | 없음 |
queue:ready:{m}:{u} | STRING | 대기열 입장 허용 토큰 | 30초 |
seat:preference:{m}:{u} | STRING | 사용자 좌석 선호 캐시 | 900초 |
queue:match | SET | 활성 티켓팅 경기 목록 | 없음 |
Redis #2 — Auth / Lock 전용
| Key | Type | 설명 | TTL |
|---|---|---|---|
refresh_token:{jti} | STRING | Refresh Token 저장 | 7일 |
token_blacklist:{jti} | STRING | 로그아웃 토큰 차단 | 남은 AccessToken TTL |
block_lock:{blockId} | STRING (SETNX) | 블록 단위 좌석 락 | 5초 |
seat:session:{token} | HASH | 좌석 선택 세션 관리 | 세션 TTL |
분리 이유
| 문제 | 해결 |
|---|---|
| 대기열 폭발 시 Redis 부하 → 인증/락 지연 | Queue 전용 인스턴스 분리로 영향 차단 |
| 블랙리스트 확인 지연 → JWT 검증 병목 | Auth/Lock 인스턴스가 항상 안정적 응답 보장 |
| 좌석 분산 락 실패 → 동시성 이슈 | 대기열 트래픽과 분리되어 락 성공률 보장 |
PostgreSQL 테이블 소유권
| 서비스 | 소유 테이블 | 비고 |
|---|---|---|
| Auth-Guard | users, user_sns, withdrawal_requests | 회원 관리 |
| Seat | seats, blocks, match_seats, seat_holds, price_policies | 좌석/가격 구조 |
| Order-Core | orders, order_seats, payments, cash_receipts | 주문/결제 |
| common-core | matches, clubs, stadiums | 공유 도메인 |