Playball Logo

Command Palette

Search for a command to run...

목차 열기

03. 오픈 시각 동기화

티켓 오픈 시각에 정확히 예매 버튼을 누르는 것은 공격의 성패를 가르는 요소 중 하나입니다. OS 스케줄러의 비실시간 특성 때문에 단일 sleep() 방식으로는 수십~수백 ms의 편향이 생깁니다. 이를 해결하기 위해 두 단계 대기 방식을 사용합니다.

두 단계 대기 방식

구간방식정확도목적
목표 시각 5초 전까지일반 sleep (OS 스케줄러 의존)±수십 ms느긋한 대기, CPU·리소스 절약
마지막 5초1ms 주기로 시각 확인하는 타이트 루프±수 ms정각 진입 정확도 확보

왜 이중 구조인가

이유설명
단일 sleep의 한계OS 스케줄러는 실시간 처리를 보장하지 않아 단일 sleep은 통상 수십~수백 ms 편향
CPU 부담 문제전체 대기 구간을 타이트 루프로 돌리면 CPU 100% 점유로 비효율
하이브리드 선택마지막 구간만 CPU 폴링으로 정밀도 확보, 나머지는 리소스 절약

스웜 단위 시간차 투입

모든 에이전트가 정각에 완전히 동시에 클릭하면 단일 호스트에서 리소스 경합이 발생합니다. 이를 완화하기 위해 에이전트 순번별로 선형 지연을 주입합니다.

지연 분산 예시

에이전트클릭 시각 (오픈 정각 기준)
agent 0+0 ms
agent 1+3,000 ms
agent 2+6,000 ms
agent 3+9,000 ms
agent 4+12,000 ms

주의 — 단일 PC에서 다수 에이전트를 정각에 동시 투입하면 호스트 리소스 경합(Chromium 프로세스 간 CPU·메모리·네트워크, Playwright 브라우저 통신 메시지 직렬 처리)으로 개별 에이전트 응답이 누적 지연됩니다.

큐 미개방 대응 (충돌 응답 409)

오픈 정각에 예매 버튼을 눌러도 서버 큐가 아직 안 열려 있어 충돌 응답(409)을 돌려주는 경우가 많습니다. 이는 백엔드 스케줄러가 초 단위로 정확히 정렬되지 않아 정각 뒤 수 초까지 큐 미개방 상태가 지속되기 때문입니다.

재시도 정책

항목
재시도 주기500ms (고정, 간격 증가 없음)
최대 재시도 시간3분 (기본값)
종료 조건큐 열림(URL 변경) 감지 또는 최대 재시도 시간 초과

재시도 흐름

오픈 정각 ── 예매 버튼 클릭
    ↓ (서버 응답 409)
[루프 진입]
    ├─ 500ms 대기
    ├─ 예매 버튼 재클릭
    ├─ URL 변경 감지?
    │    ├─ YES → 루프 종료, 다음 상태로
    │    └─ NO  → 계속
    └─ 최대 재시도 시간 초과?
         ├─ YES → SX(ABORT)
         └─ NO  → 계속

왜 고정 주기인가 (지수 백오프 대신)

  • 큐 개방은 서버 스케줄러의 이벤트이지 점점 혼잡해지는 상황이 아님
  • 지수 백오프를 쓰면 큐 열린 순간을 놓쳐 경쟁자에게 뒤처짐
  • 고정 짧은 주기로 "큐 열리는 순간 즉시 진입"이 유리

실전 환경 vs 시뮬레이션 환경

환경예매 클릭 시간차큐 순위 차이VQA 진입 시간차
실전 (정상 유저 수만 명)0.1초수백~수천 번1~2분
시뮬레이션 (경쟁 유저 부족)0.1초거의 동일거의 동시

시간차 투입의 이중 의미

  1. 호스트 부하 분산 — 정각 동시 실행 시 생기는 리소스 경합 완화
  2. 실전 시간차 재현 — 실전에서는 정상 유저 트래픽 때문에 자연스럽게 큐 순위가 벌어지지만, 시뮬레이션에는 경쟁 유저가 없어 동시에 VQA가 뜸. 예매 클릭 시간차로 이 gap을 인위적으로 재현.

"그럼 스웜이 왜 유리한가"에 대한 답변

  • 에이전트의 예매 클릭 속도는 사람보다 월등히 빠르므로 정각 직후 상위권 진입은 거의 확정
  • 첫 진입이 100번대면 5번째도 5000번대 안쪽 — 전원이 여전히 상위권
  • 0.1초 차이만 있어도 큐 구조상 VQA 진입은 자연스럽게 분 단위로 벌어짐
  • 시간차 투입은 "약점"이 아니라 시뮬 환경과 실전 환경의 gap 보정

매개변수

매개변수기본값설명
open-at없음 (즉시 실행)ISO8601 형식 오픈 시각 (타임존 포함 권장)
open-at-click-spacing-ms3000에이전트 간 클릭 선형 지연
open-at-queue-retry-ms180000큐 미개방 시 최대 재시도 총 시간 (3분)

기록되는 이벤트

이벤트발생 시점
PRE_ENTRY_QUEUE_OPENED예매 버튼 첫 클릭
ENTRY_CLICKED대기열 진입 클릭 성공
QUEUE_PASSED대기열 통과 확인

참조