Skip to content

bmcho/user-queue-system

Repository files navigation

🕒 User-Queue-System

대규모 트래픽 상황(신규 게임 서버 오픈, 한정판 구매, 이벤트 페이지 등)에서
사용자 요청을 선착순 대기열로 제어하고 순번에 따라 입장을 허용하는 Spring Boot 예제입니다.

Live DEMO 시나리오

  1. /waiting-room?queue=default&user_id=101&redirect_url=/home 접속
  2. 대기 순번 표시 → 스케줄러가 허용되면 자동으로 /home으로 이동
  3. 백오피스(API 또는 스케줄러)가 3명씩 입장을 허용

📑 핵심 기능 & 흐름

┌──────────────┐         POST /queue            ┌───────────────┐
│  Client      │  ───────── register ─────────▶ │  Redis ZSET   │
│  (Browser)   │                                │  wait:<queue> │
└──────────────┘                                └───────────────┘
       ▲                                             │`
       │ GET /rank                                   │  ZPOP
       │ GET /allowed                                ▼
┌──────────────┐        allow (Scheduler/API)   ┌───────────────┐
│ Waiting room │ ◀────────────────────────────► │  Redis ZSET   │
│ (Thymeleaf)  │                                │ proceed:<q.>  │
└──────────────┘                                └───────────────┘
단계 설명
① 대기열 등록
POST /api/v1/queue
Redis users:queue:{queue}:wait (ZSET)에 가입 시각을 score로 삽입 & 내 순번 반환
② 대기 페이지
/waiting-room
순번을 주기적으로 조회하여(REST) 입장 허용 시 redirect_url로 이동
③ 입장 허용
/queue/allow 또는 스케줄러
wait ZSET에서 N명 ZPOPproceed ZSET으로 이동, 동시에 토큰 발급
④ 토큰 검증
/queue/allowed
사용자는 /touch로 토큰 쿠키를 발급받고, 입장 시 토큰으로 최종 검증

✔️ ZSET을 사용하므로 O(log N) 정렬·조회, Reactive Redis로 논블로킹 처리
✔️ @Scheduled 동작 여부는 application.yaml > scheduler.enabled로 on/off


🗂️ 프로젝트 구조

user-queue-system/
├── build.gradle              # 멀티 모듈 루트 (Gradle 8.x)
├── settings.gradle           # include "x-flow"
└── x-flow/                   # API & Waiting‑Room
    ├── src/main/java/com/bmcho/xflow
    │   ├── controller        # REST + Thymeleaf Controller
    │   ├── service           # Queue 로직 (Redis ZSET)
    │   ├── dto               # API 응답 VO (Record)
    │   └── exception         # 공통 오류 처리
    ├── src/main/resources
    │   ├── templates/        # waiting-room.html
    │   └── application.yaml
    └── build.gradle

추가 폴더 x-website/ 는 단순 Spring MVC 샘플 페이지(독립 프로젝트)로,
실동작과는 무관합니다.


🔧 기술 스택

범주 사용 기술
Core Spring Boot 3.5, Spring WebFlux, Reactive Redis
DB Redis 7 (ZSET, SCAN)
View Thymeleaf 3
Build Gradle 8, Java 17 Toolchain
Test JUnit 5, embedded‑redis (메모리 Redis)

🚀 빠른 시작 (로컬)

1) Redis 준비

docker run -d --name redis -p 6379:6379 redis:7-alpine

2) 애플리케이션 실행

cd user-queue-system
./gradlew :x-flow:bootRun
# 기본 포트 9010, profile=local

3) 사용 예시

# ① 대기열 등록 (user_id=100)
curl -X POST "http://localhost:9010/api/v1/queue?queue=default&user_id=100"
# → {"rank":1}

# ② 3명 허용
curl -X POST "http://localhost:9010/api/v1/queue/allow?queue=default&count=3"
# → {"requestCount":3,"allowedCount":1}

# ③ 순번 조회
curl "http://localhost:9010/api/v1/queue/rank?queue=default&user_id=100"

TIP 스케줄러 자동 허용을 사용하려면 application.yaml
scheduler.enabled: true로 두고 주기·허용 인원(count)을 UserQueueService#scheduleAllowUser에서 조정하세요.


🌐 REST API 요약

Method URI Query String 설명
POST /api/v1/queue queue, user_id 대기열 등록 & 순번 반환
POST /api/v1/queue/allow queue, count 대기열에서 N명 허용
GET /api/v1/queue/rank queue, user_id 현재 순번 조회
GET /api/v1/queue/touch queue, user_id 토큰 쿠키 발급
GET /api/v1/queue/allowed queue, user_id, token 입장 가능 여부
GET /waiting-room queue, user_id, redirect_url 대기 페이지(HTML)

🛠️ 설계 포인트

  1. 토큰 기반 입장 검증
    동일 사용자가 브라우저 새로고침만으로 대기열을 건너뛰지 못하도록
    SHA‑256(user-queue-{queue}-{userId}) 기반 토큰을 쿠키로 발급·검증합니다.

  2. 멀티 대기열 지원
    Redis 키에 {queue} 변수를 사용 (users:queue:{queue}:wait)
    → 서비스 인스턴스 1개로 여러 이벤트 대기열 동시 운영 가능.

  3. Reactive Non‑Blocking
    ReactiveRedisTemplate·Project Reactor로 트래픽 피크 상황에서도
    스레드 풀 증설 없이 적은 리소스로 처리합니다.

  4. Embedded Redis 테스트
    CI나 로컬 테스트 시 외부 Redis 의존성 없이 단위 테스트를 실행합니다.


⚠️ 실제 서비스 적용 시 고려 사항

항목 보강 내용
보안 토큰 위·변조 방지(HMAC 서명), HTTPS, CORS
대기열 공정성 IP/계정당 중복 등록 방지, BOT 감지(Recaptcha)
모니터링 허용률·대기 인원·실패률 Prometheus / Grafana 지표
백오피스 관리자 대시보드(WebSocket)로 실시간 제어
고가용성 Redis Cluster / Sentinel, 앱 다중 인스턴스

⚠️ 참고 사항

⚠️ 이 프로젝트는 학습 및 구조 설계 목적의 예제입니다.

실 서비스 적용 시에는 인증, 보안, 장애 복구, 데이터 일관성 등을 추가로 고려해야 합니다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages