[INFRA-07] 마케팅 스파이크 시나리오 (20000TPS 도전)

작업 내용 (설계 의도)

변경 사항

근거 TDD: ../TDD.md “형제 과제 접점”(③), ADR-001. FR-5. 예약된 시각에 20000TPS를 목표로 급증·감쇠, ③ 한정판 엔드포인트 대상. 미달 시 도달 TPS·병목 기록(③과 동일 기준).

  • qa/load/k6/marketing-spike.js(신규) — ramping-arrival-rate, lib/diurnal.js#spikeStages()(0→20000, 30초 내 → steady → 감쇠). 대상 POST /limited-drops/{dropId}/orders(X-User-Id + Idempotency-Key, dropId는 .env.sim). 정상 실패(425/409/429/403)는 5xx 계산 제외. handleSummary로 달성률·병목(client vs server) 리포트. 예약 트리거: 연속 곡선 내 startTime 오프셋 또는 reseed 컨테이너 cron이 지정 시각에 기동.

의존

  • INFRA-01 (lib), INFRA-03 (synthetic drop). 런타임 선행: ③ 배포.

다이어그램

처리 흐름

sequenceDiagram
    participant K as k6 spike
    participant L as nginx-lb
    participant B as backend
    K->>K: startTime 도달
    K->>L: 0→20000 TPS (30초 내)
    L->>B: limited-drop orders
    B-->>K: 202/409(SoldOut)/429
    K->>K: 감쇠 + gap report

테스트 케이스

  • spikeStages 첫 stage가 30초 이내 target 20000에 도달한다(±30초 NFR).
  • 대상이 ③ POST /limited-drops/{dropId}/orders이고 .env.sim의 dropId를 사용한다.
  • SoldOut(409)·Throttled(429)·TooEarly(425)가 5xx 실패로 집계되지 않는다.
  • 20000TPS 미달 시 gap report에 달성률과 병목(client vs server)이 기록되고 실행이 중단되지 않는다.
  • 예약 시각 도달 전에는 스파이크 부하가 발생하지 않는다.