목차 열기
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초 | 거의 동일 | 거의 동시 |
시간차 투입의 이중 의미
- 호스트 부하 분산 — 정각 동시 실행 시 생기는 리소스 경합 완화
- 실전 시간차 재현 — 실전에서는 정상 유저 트래픽 때문에 자연스럽게 큐 순위가 벌어지지만, 시뮬레이션에는 경쟁 유저가 없어 동시에 VQA가 뜸. 예매 클릭 시간차로 이 gap을 인위적으로 재현.
"그럼 스웜이 왜 유리한가"에 대한 답변
- 에이전트의 예매 클릭 속도는 사람보다 월등히 빠르므로 정각 직후 상위권 진입은 거의 확정
- 첫 진입이 100번대면 5번째도 5000번대 안쪽 — 전원이 여전히 상위권
- 0.1초 차이만 있어도 큐 구조상 VQA 진입은 자연스럽게 분 단위로 벌어짐
- 시간차 투입은 "약점"이 아니라 시뮬 환경과 실전 환경의 gap 보정
매개변수
| 매개변수 | 기본값 | 설명 |
|---|---|---|
open-at | 없음 (즉시 실행) | ISO8601 형식 오픈 시각 (타임존 포함 권장) |
open-at-click-spacing-ms | 3000 | 에이전트 간 클릭 선형 지연 |
open-at-queue-retry-ms | 180000 | 큐 미개방 시 최대 재시도 총 시간 (3분) |
기록되는 이벤트
| 이벤트 | 발생 시점 |
|---|---|
PRE_ENTRY_QUEUE_OPENED | 예매 버튼 첫 클릭 |
ENTRY_CLICKED | 대기열 진입 클릭 성공 |
QUEUE_PASSED | 대기열 통과 확인 |
참조
- 02-workflow-states — 상태머신 전반
- 06-swarm-infrastructure — 스웜 단위 지연 주입 구조