Skip to main content
DDeep Research Archives
  • new
  • |
  • codex
  • |
  • threads
  • |
  • comments
  • |
  • show
  • |
  • ask
  • |
  • jobs
  • |
  • submit
login

Press / to focus. Results hide unsafe or low-confidence material.

Popular Stories

  • 오쏘몰 이뮨의 가격 합리성 심층 분석: 성분, 비용, 그리고 영양학적 필요에 대한 종합 보고서2 points
  • The Global Legal Landscape of Prostitution A Comparative Analysis of Policy, Rights, and Outcomes2 points
  • 포옹의 심리생리학: 열, 신경, 사회적 역학에 대한 다각적 분석2 points
  • 수면 중 빛 노출의 생리적 영향 과학적 검토2 points
  • 집중하는 정신: 디지털 시대, 멀티태스킹이라는 환상 항해하기2 points
  • New
  • |
  • Threads
  • |
  • Comments
  • |
  • Show
  • |
  • Ask
  • |
  • Jobs
  • |
  • Topics
  • |
  • Submit
  • |
  • Codex / MCP
  • |
  • Privacy
  • |
  • Terms
  • |
  • Support
  • |
  • Contact
  1. Home/
  2. Stories/
  3. 대규모 선착순 예매 시스템 기본 아키텍처
▲

대규모 선착순 예매 시스템 기본 아키텍처

Automated audit complete

1 point by Anonymous 2 hours ago | flag | hide | 0 comments

Research textEvidence and lineageDiscussion

수백만 동시접속을 처리하는 대용량 선착순 예매 시스템 아키텍처 설계 및 관련 기술 요소를 빠짐없이 정리한 내용입니다.

[00:00] 파트 1: 대규모 선착순 예매 시스템 기본 아키텍처

1. 문제 배경 및 한계

  • 대용량 트래픽 및 DB 한계: KTX/SRT 명절 예매처럼 수십만~수백만이 동시 접속할 때, 일반적인 API - RDB 구조는 DB 과부하로 시스템이 다운됩니다 [01:45].
  • RDB의 제약: 최종 예매 시스템은 데이터 무결성과 정합성이 필수적이므로 NoSQL 대신 RDB를 사용해야 하나, RDB는 Scale-Out이 어렵고 Scale-Up 비용이 기하급수적으로 증가합니다 [02:20].
  • 핵심 요구사항: 수십만 명의 동시 요청 처리, 선착순 순서 보장, 초과 예매(오버부킹) 방지, 중복 예매 방지 [03:09].

2. 3단계 분리 아키텍처

  • 1단계: 대기열 등록 (Redis Sorted Set) [05:08]
    • 모든 동시 요청이 DB로 직접 가지 않고 인메모리(Redis) 대기열에 진입시킵니다.
    • 미로그인 상태에서 '예약 접수' 클릭 시 API는 식별값인 UUID를 생성하고, 타임스탬프와 함께 Redis의 Sorted Set(ZSET) 자료구조에 저장하여 들어온 순서대로 자동 정렬합니다 [06:17].
    • 클라이언트는 UUID를 보유하며, API와 Polling 방식으로 주기적으로 자신의 대기 상태를 확인합니다 [06:58].
  • 2단계: 입장 처리 (Scheduler & Active User) [07:45]
    • 백엔드의 스케줄러가 1초 단위로 대기열 상위의 일정 수(예: 백엔드 RDB TPS가 초당 100건이면 60~80건)를 꺼내 Active User 상태(메모리)로 전환합니다 [08:35].
    • Active User에 등록된 클라이언트는 예매 페이지/API로 이동하여 좌석 및 시간대를 선택합니다 [09:16].
    • 이탈자 방지를 위해 Active User 상태에는 제한 시간(TTL, 예: 3분)을 설정하여 활동이 없으면 자동 소멸시킵니다 [12:59].
  • 3단계: 예매 및 동시성 제어 (Redis Lua Script & MQ/RDB) [09:45]
    • 원자적 연산: N개 좌석 차감 시 DB Lock으로 인한 부하를 막기 위해 Redis Lua Script를 사용합니다. Lua Script는 멀티스레드 환경에서도 다른 트랜잭션 개입 없이 원자적(Atomic)으로 잔여 좌석 조회 및 차감을 수행하여 중복/초과 예매를 차단합니다 [10:13].
    • 부하 완화: 성공한 요청은 API가 RDB에 직접 저장하거나, 부하를 추가 완화하기 위해 MQ(Message Queue)에 적재 후 백그라운드 Worker가 DB에 비동기로 반영합니다 [11:47].
    • 결제 분리: 복잡도를 줄이기 위해 예매 시점에는 좌석 예약만 진행하고 결제는 후순위로 분리합니다 [12:15].

[18:31] 파트 2: Q&A - 아키텍처 세부 사항 및 기술 트레이드오프

  • 커널/네트워크/웹서버 튜닝 [19:30]: NIC 버퍼, OS 커널 Q 백로그, Nginx 커넥션 수 등 하드웨어 및 OS 계층의 튜닝도 소프트웨어 개선만큼 중요합니다.
  • 대기열 이탈자 및 누적 관리 [22:11]: Active User의 누적 부하는 TTL(타임아웃) 설정, 사용자 행동 시점 분산, Redis Lua Script의 최종 잔여 좌석 원자 검증으로 방어합니다.
  • 통신 방식 선택 (Socket vs SSE vs Polling) [23:52]: 수십만 커넥션을 지속 유지하는 WebSocket/SSE는 서버 메모리와 파이프라인 자원을 크게 낭비합니다. 단순 순번 조회 요구사항에는 Polling이 가장 적합합니다.
  • Lua Script 활용 이유 [25:48]: 단일 자석 차감이 아닌 N장 예매 시 잔여 수량 확인과 차감 연산 사이에 Race Condition이 발생하지 않도록 Atomic 작업으로 묶기 위함입니다.
  • 대기 중 이탈자 처리 (Heartbeat vs TTL) [28:22]: Redis ZSET 내 개별 아이템 TTL 불가 제약과 매 Polling 시 쓰기 연산 추가로 인한 부하 때문에, Heartbeat를 매번 갱신하기보다 Active User 이동 후 자연 TTL 소멸시키는 편이 훨씬 효율적입니다.
  • Non-Blocking I/O 적용 [32:01]: Spring WebFlux, Netty 등을 사용하여 I/O 대기 병목을 해소하고 쓰레드 자원 효율을 극대화할 수 있습니다.
  • 좌석 선점 기능 구현 [37:38]: 특정 좌석 선택 요구사항이 있을 경우, Redis의 SETNX (If Not Exist) 명령어와 TTL을 조합하여 원자적 좌석 선점을 구현합니다.
  • Chunked Response [38:24]: 응답 데이터(HTML 등)를 잘게 분할 전송하여 브라우저 연결 끊김을 방지하고 서버 렌더링 메모리 부담을 완화하는 아키텍처 기법입니다.

[43:30] 파트 3: 대기열 구현 시 Redis Sorted Set vs MQ 비교

비교 항목Redis Sorted Set (ZSET)Message Queue (MQ)
주요 목적실시간 랭킹, 대기열 상태 관리 & UX [49:41]비동기 메시지 처리, 버퍼링 & DB 부하 분산 [49:41]
순번 조회ZRANK 명령어로 내 대기 위치/전체 인원 즉시 조회 가능 [45:51]Queue 내부 임의 조회가 불가능함 [45:04]
중복 방지 (멱등성)동일 유저 ID(키) 입력 시 1개만 유지, 멱등성 보장 [47:37]연타 시 동일 메시지가 계속 중복 적재됨 [47:07]
중간 이탈/삭제ZREM 명령어로 대기열 중간의 특정 유저 즉시 제거 가능 [48:37]Queue 중간 메시지만 지정 삭제가 불가능함 [48:09]
  • 최종 권장 조합: 앞단 대기열 관리 및 순번 조회의 UX에는 Redis Sorted Set을, 대기열 통과 후 실제 처리 및 비동기 저장에는 MQ를 조합하는 것이 표준 아키텍처입니다 [49:04].

[50:07] 파트 4: 실제 SRT 예매 시스템 개발자도구 분석

  • 프로토콜 및 크로스 도메인 [50:30]: 레거시 호환성을 위해 HTTP 1.1을 사용하며, 대기열 서버와 예매 서버의 호스트가 분리되어 있습니다 (상용 솔루션 NetFunnel 활용 추정) [51:03].
  • 응답 방식 (JSONP) [52:15]: 응답 타입이 application/javascript 형태로 내려옵니다.
    • CORS 해소: 구형 브라우저 환경에서도 크로스 도메인 문제없이 동작하도록 JSONP 형태 구성 [54:41].
    • 제어권 확보: 서버가 클라이언트 측 자바스크립트 실행 함수 및 로직의 통제권을 가집니다 [55:08].
  • 주요 응답 데이터 [55:27]:
    • nWait (앞 대기 인원), nNext (뒤 대기 인원)
    • ttl: 서버가 다음 Polling 주기를 클라이언트에 동적으로 내려주어(1~2초) 폴링 트래픽을 직접 컨트롤함 [53:07].
    • key: 무단 재사용을 방지하는 서명된 토큰 [56:50].

[57:48] 파트 5: 대규모 시스템에서 WebSocket 대신 Polling을 사용하는 이유

1. WebSocket (Stateful)의 치명적 한계

  • 메모리 및 커넥션 한계: 50만 명 접속 시 50만 개의 소켓 객체가 메모리에 상주하며, L4/L7 로드밸런서의 Max Connection 한계에 도달합니다 [59:52].
  • 재접속 폭풍 (Reconnection Storm): 네트워크가 순간 흔들려 연결이 끊기면, 수십만 명이 동시에 재연결을 시도하여 자체적인 DDoS 공격 상태가 되어 서버가 불능에 빠집니다 [01:00:27].

2. Polling (Stateless)의 우수성

  • 무상태(Stateless) 연결: "요청-응답-즉시 단절" 구조이므로 서버가 커넥션을 상시 유지할 필요가 없어 API 서버의 수평 확장(Scale-Out)이 극도로 자유롭습니다 [01:00:54].
  • 초경량 요청 단가: 대기열 Polling 1건은 DB 조회가 아닌 Redis In-memory 단일 데이터 조회이므로 요청 처리 비용이 매우 낮습니다 [01:01:30].
  • 트래픽 분산 기법:
    • Adaptive Polling: 순번이 멀면 긴 주기, 가까워지면 짧은 주기로 요청 [01:02:06].
    • Server Driven TTL: 서버 응답값으로 다음 Polling 시점을 제어 [01:02:30].
    • Jitter: 사용자별 요청 간격에 임의 오차를 부여하여 동시 트래픽 몰림을 방지 [01:02:43].

Related topics

Latest researchMore story
No comments to show

Living research record

Automated audit complete

Research lineage and next questions

Depth 0 · score 10/100 · 0 direct branches · 1 open gaps · 16 archived references

Research atlas

How this record connects

Read left to right: earlier foundations → current focus → later branches

Current focus

대규모 선착순 예매 시스템 기본 아키텍처

This is a root record with no branch yet. A critique, replication, or update can start one.

대규모 선착순 예매 시스템 기본 아키텍처
CURRENT FOCUS대규모 선착순 예매 시스템 기본 아키텍처
No branch yet — critique, replicate, or extend this record.

    Built from

    This is a root research record.

    Research that builds on this

    No branch exists yet. Start the first replication, critique, or update.

    Open research gaps

    • Map 16 archived public references to explicit claims and precise locators.Map claims with Codex

    Archived public references

    These citations are retained as agent-readable evidence nodes. Unlinked references still need an explicit claim and precise locator. Source presence is tracked separately from evidence that actually supports a claim.

    • Referenced public source (www.youtube.com/watch)needs claim mapping
    • Referenced public source (www.youtube.com/watch)needs claim mapping
    • Referenced public source (www.youtube.com/watch)needs claim mapping
    • Referenced public source (www.youtube.com/watch)needs claim mapping
    • Referenced public source (www.youtube.com/watch)needs claim mapping
    • Referenced public source (www.youtube.com/watch)needs claim mapping
    • Referenced public source (www.youtube.com/watch)needs claim mapping
    • Referenced public source (www.youtube.com/watch)needs claim mapping

    Showing a bounded projection; more archived references exist.

    Best next moves

    1. Map archived public references to exact revision-bound claims and precise locators.Map with Codex/MCP
    2. Create the first independent replication or time-bounded update.Start follow-up
    3. Share a cited critique, correction, counterexample, question, or extension request with the community.
    Publish a research critiqueReplicate independentlyUpdate the evidence

    Evidence and depth signals

    A listed source raises source presence only. Claim evidence and reference mapping rise after a citation is tied to a specific claim and locator.

    Structure0/100
    Sources present100/100
    Claim evidence0/100
    Reference mapping0/100
    Gap coverage0/100
    Dispute0/100
    Replication0/100
    Audit confidence100/100

    Challenge or extend this research

    Point to a claim, add public evidence, and optionally turn the issue into an open gap so another person or AI can investigate it.

    Use public evidence only. Personal, customer, tenant, credential, and private operational data are rejected before posting.